Jak utworzyć komunikat wyjściowy

208

Czy istnieje jedno wywołanie funkcji linii, które zamyka program i wyświetla komunikat? Wiem, że w Perlu jest to tak proste, jak:

die("Message goes here")

Mam dość pisania tego:

puts "Message goes here"
exit
Chris Bunch
źródło
10
Mała uwaga, wasze putszapisy do stdout, podczas diezapisu do stderr, więc: $stderr.puts "Message goes here".
cdarke
Wiem, że to nie była odpowiedź, ale odpowiedziała na moje pytanie, dzięki
Patrick
Tylko dla odniesienia, w Pythonie jest sys.exit("Message goes to stderr").
anatoly techtonik

Odpowiedzi:

361

abortFunkcja to robi. Na przykład:

abort("Message goes here")

Uwaga: abortwiadomość zostanie zapisana STDERRw przeciwieństwie do, do putsktórej będzie pisać STDOUT.

Chris Bunch
źródło
6
Łał! Niezłe znalezisko! Szkoda, że ​​nie tylko przeciążyli wyjścia tą funkcją ...
Mike Stone
56
Uwaga: polecenie przerwania kończy działanie programu ze statusem false, co oznacza awarię. exit domyślnie kończy pracę ze statusem true reprezentującym sukces. Upewnij się, że używasz odpowiedniego do sytuacji.
Alex Spurling,
1
re. Komentarz Mike'a Stone'a czasem wygląda na to, że Ruby został napisany przez zespół ludzi, którzy nie mieli ze sobą żadnej komunikacji, prawda? (Mimo to programowanie w nim jest tak łatwe.)
JellicleCat
24

Jeśli chcesz wskazać rzeczywisty błąd w kodzie, możesz zgłosić RuntimeErrorwyjątek:

raise RuntimeError, 'Message goes here'

Spowoduje to wydrukowanie śledzenia stosu, typu zgłaszanego wyjątku i podanego komunikatu. W zależności od użytkowników ślad stosu może być zbyt przerażający, a rzeczywista wiadomość może zagubić się w hałasie. Z drugiej strony, jeśli umrzesz z powodu rzeczywistego błędu, stacktrace dostarczy ci dodatkowych informacji do debugowania.

Jörg W Mittag
źródło
24
Nie trzeba wspominać o RuntimeError, aby zgłosić jeden (jest to domyślny rodzaj zgłaszanego wyjątku), więc wystarczy następujący kod: podwyżka „Wiadomość idzie tutaj”
sunaku,
sunaku - chociaż twój komentarz jest całkowicie poprawny, często stwierdziłem, że bardziej precyzyjne może być przydatne, w szczególności dla innych osób czytających kod później.
shevy
2

Nigdy nie słyszałem o takiej funkcji, ale wdrożenie jej byłoby wystarczająco trywialne ...

def die(msg)
  puts msg
  exit
end

Następnie, jeśli jest to zdefiniowane w jakimś pliku .rb, który dołączasz do wszystkich swoich skryptów, jesteś złoty ... tylko dlatego, że nie jest wbudowany, nie oznacza, że ​​nie możesz zrobić tego sam ;-)

Mike Stone
źródło
3
Okazuje się, że robi to funkcja „przerywania” (patrz moja odpowiedź poniżej)
Chris Bunch,
1
Po co pisać kod, gdy funkcja przerywania robi to za Ciebie?
Gary Haran
2
@ChrisBunch Nie jest to to samo, co funkcja przerwania: exitdomyślnie zwraca wartość tak, jakby się powiodła. abortzwraca błąd. exit 1zwróci również awarię.
TemporalWolf,
2

Przybyłem tutaj, szukając sposobu na wykonanie kodu po zakończeniu programu.
Znaleziono to :

Kernel.at_exit { puts "sayonara" }
# do whatever
# [...]
# call #exit or #abort or just let the program end
# calling #exit! will skip the call

Wielokrotne wywołanie spowoduje zarejestrowanie wielu programów obsługi.

Giuse
źródło