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")
?
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 Exception
s. 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.
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
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
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