Ruby/Przetwarzanie wyjątków: rescue: Różnice pomiędzy wersjami

Usunięta treść Dodana treść
Szymon wro (dyskusja | edycje)
Nie podano opisu zmian
Szymon wro (dyskusja | edycje)
Nie podano opisu zmian
Linia 83:
Wystapil blad: test2
nil
</pre>
 
Zmienna <tt>$!</tt> zwraca konkretny obiekt który jest podklasą klasy <tt>Exception</tt>. Klasa <tt>Exception</tt> jest nadklasą (niekoniecznie wprost) wszystkich wyjątków. Cechę tę można efektywnie wykorzystać podczas definiowania różnych bloków obsługujących poszczególne typy wyjątków.
 
<pre>
ruby> begin
| plik = open("jakis_plik")
| rescue SystemCallError
| puts "Blad WE/WY: #{$!}"
| rescue Exception
| puts "Blad: #{$!}"
| end
Blad WE/WY: No such file or directory - jakis_plik
nil
</pre>
 
Operacja otwarcia pliku generuje wyjątek będący podklasą <tt>SystemCallError</tt> więc zostanie wykonany blok obsługujący ten wyjątek. Interpreter po kolei sprawdza wszystkie bloki <tt>rescue</tt> i wykonuje pierwszy pasujący. Z tego też powodu nie należy umieszczać <tt>rescue Exception</tt> jako pierwszego, gdyż <tt>Exception</tt> jako nadklasa wszystkich wyjątków będzie tu zawsze pasować i blok obsługujący <tt>Exception<tt> będzie zawsze wykonywany.
 
Jeżeli podmienimy <tt>plik = open("jakis_plik")</tt> na np. <tt>raise "jakis blad"</tt> wykonany zostanie blok <tt>rescue</tt> obsługujący <tt>Exception</tt>:
 
<pre>
ruby> begin
| raise "jakis blad"
| rescue SystemCallError
| puts "Blad WE/WY: #{$!}"
| rescue Exception
| puts "Blad: #{$!}"
| end
Blad: jakis blad
nil
</pre>
 
Zamiast zmiennej <tt>$!</tt> można używać zmiennych nazwanych stosując operator <tt>=></tt> i składnię przypominającą definiowanie wpisu hasha.
<pre>
begin
# ... jakis kod ...
rescue SystemCallError => e
puts "Blad we/wy: #{e}"
rescue Exception => e
puts "Blad: #{e}"
end
</pre>