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

Usunięta treść Dodana treść
Nie podano opisu zmian
Szymon wro (dyskusja | edycje)
Linia 1:
== Przetwarzanie wyjątków: ensure ==
 
Może się tak zdarzyć, że potrzebne jest dodatkowe sprzątanie, gdy metoda kończy swoją pracę. Być może otwarty plik powinien być zamknięty, bufor opróżniony, itp. Jeżeli byłby zawsze tylko jeden punkt wyjścia dla każdej metody, moglibyśmy z pełną ufnością umieśćumieścić kod czyszczący w jednym miejscu i wiedzielibyśmy, że zostanie on wykonany. Jednakże, metoda może zwracać wartość z różnych miejsc, lub nasze zamierzone czyszczenie może być niespodziewane ominięte z powodu wyjątku.
 
<pre>
begin
fileplik = open("/tmp/some_filejakis_plik", "w")
# ... writezapis todo the filepliku ...
fileplik.close
end
</pre>
Linia 15:
<pre>
begin
fileplik = open("/tmp/some_filejakis_plik", "w")
# ... writezapis todo the filepliku ...
fileplik.close
rescue
fileplik.close
fail # raiseponownie anpodnosi exceptionprzechwycony wyjatek
end
</pre>
 
Ten kod nie dość, że niezdarny, tobędzie odrzuci nas od niego gdy stanie się onjeszcze bardziej skomplikowany, ponieważ trzeba będzie wymagał obsługiobsługiwać każdegokażdy <tt>return</tt> i <tt>break</tt>.
 
Z tego powodu dodamy nowe słowo kluczowe do naszego schematu "<tt>begin...rescue...end</tt>", którym jest <tt>ensure</tt>. Blok <tt>ensure</tt> wykonuje się niezależnie od pomyślnego lub niepomyślnego zakończenia bloku <tt>begin</tt>.
Linia 30:
<pre>
begin
fileplik = open("/tmp/some_filejakis_plik", "w")
# ... writezapis todo the filepliku ...
rescue
# ... handleobsluga the exceptionswyjatkow ...
ensure
fileplik.close # ... andzawsze this always happenswykonywane.
end
</pre>