Jaka jest różnica między` raise `foo ' a ' raise Exception.nowy ("foo")"?

Jaka jest różnica-techniczna, filozoficzna, pojęciowa lub inna-między

raise "foo"

I

raise Exception.new("foo")

?

Author: John Bachir, 2011-01-26

2 answers

Technicznie, pierwszy wywołuje błąd RuntimeError z Komunikatem ustawionym na "foo", a drugi wywołuje wyjątek z Komunikatem ustawionym na "foo".

Praktycznie istnieje znacząca różnica między tym, kiedy chcesz użyć pierwszego, a tym, kiedy chcesz użyć drugiego.

Mówiąc najprościej, prawdopodobnie chcesz RuntimeError, a nie Exception. Blok ratunkowy bez argumentu złapie RuntimeErrors, ale nie złapie Exceptions. Więc jeśli podniesiesz Exception w swoim kodzie, ten kod nie będzie catch it:

begin
rescue
end

Aby złapać Exception będziesz musiał to zrobić:

begin
rescue Exception
end

Oznacza to, że w pewnym sensie Exception jest "gorszym" błędem niż RuntimeError, ponieważ musisz zrobić więcej pracy, aby się z niego wydobyć.

To, co chcesz, zależy od tego, jak Twój projekt obsługuje błędy. Na przykład, w naszych demonach, główna pętla ma pusty ratunek, który złapie RuntimeErrors, zgłosi je, a następnie kontynuuje. Ale w jednej lub dwóch okolicznościach chcemy, aby daemon naprawdę umieramy w przypadku błędu i w takim przypadku wywołujemy Exception, który przechodzi prosto przez nasz "normalny kod obsługi błędów" i wychodzi.

I znowu, jeśli piszesz kod biblioteki, prawdopodobnie chcesz RuntimeError, a nie Exception, ponieważ użytkownicy Twojej biblioteki będą zaskoczeni, jeśli pojawią się błędy, których pusty blok rescue nie może wychwycić, i zajmie im chwilę zrozumienie dlaczego.

Wreszcie, powinienem powiedzieć, że RuntimeError jest podklasą klasy StandardError, a faktyczna zasada jest taka, że chociaż ty can raise każdy typ obiektu, puste rescue domyślnie wychwytuje tylko wszystko, co dziedziczy z StandardError. Wszystko inne musi być konkretne.

 108
Author: Daniel Lucraft,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-02-01 04:53:57

Z oficjalnej dokumentacji:

raise   
raise( string )
raise( exception [, string [, array ] ] )

Bez argumentów podnosi wyjątek w $! lub podnosi RuntimeError Jeśli $! jest zerowe. Z pojedynczym argumentem String, podnosi {[3] } z łańcuchem jako wiadomością. W przeciwnym razie pierwszym parametrem powinna być nazwa klasy Exception (lub obiektu, który zwraca wyjątek Exception podczas wysłania). Opcjonalny drugi parametr ustawia wiadomość powiązaną z wyjątkiem, a trzeci parametr jest tablicą informacji zwrotnych. Wyjątki są przechwytywane przez klauzulę ratunkową begin...end bloków.

raise "Failed to create socket"
raise ArgumentError, "No parameters", caller
 30
Author: ennuikiller,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-28 07:41:47