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

Usunięta treść Dodana treść
Szymon wro (dyskusja | edycje)
Nie podano opisu zmian
Nie podano opisu zmian
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ść 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 niespodziewane ominięte z powodu wyjątku.
Może się tak zdarzyć, że potrzebna jest
There may be cleanup work that is necessary when a method finishes its work. Perhaps an open file should be closed, buffered data should be flushed, etc. If there were always only one exit point for each method, we could confidently put our cleanup code in one place and know that it would be executed; however, a method might return from several places, or our intended cleanup code might be unexpectedly skipped because of an exception.
 
<pre>
begin
file = open("/tmp/some_file", "w")
Linia 9:
file.close
end
</pre>
 
W powyższym przykładzie, jeżeli wyjątek wystąpiłby w sekcji kodu, w której dokonujemy zapisu do pliku, plik mógłby pozostać otwarty. A my nie chcemy uciekać się tego rodzaju [[w:Redundancja|redundancji]]:
In the above, if an exception occurred during the section of code where we were writing to the file, the file would be left open. And we don't want to resort to this kind of redundancy:
 
<pre>
begin
file = open("/tmp/some_file", "w")
Linia 20 ⟶ 22:
fail # raise an exception
end
</pre>
 
Ten kod nie dość, że niezdarny, to odrzuci nas od niego gdy stanie się on bardziej skomplikowany, ponieważ będzie wymagał obsługi każdego <tt>return</tt> i <tt>break</tt>.
It's clumsy, and gets out of hand when the code gets more complicated because we have to deal with every return and break.
 
ForZ thistego reasonpowodu wedodamy addnowe anothersłowo keywordkluczowe todo thenaszego schematu "<tt>begin...rescue...end</tt>" scheme, whichktórym isjest <tt>ensure</tt>. TheBlok <tt>ensure</tt> codewykonuje blocksię executesniezależnie regardlessod ofpomyślnego thelub successniepomyślnego orzakończenia failure of thebloku <tt>begin block</tt>.
 
<pre>
begin
file = open("/tmp/some_file", "w")
Linia 33 ⟶ 37:
file.close # ... and this always happens.
end
</pre>
 
ItMożliwe isjest possible to useużywanie <tt>ensure</tt> withoutbez <tt>rescue,</tt> ori vice versa, butale ifjeśli theyużywane are usedrazem togetherw intym thesamym samebloku <tt>begin...end block</tt>, the rescue must<tt>rescure</tt> precedemusi thepoprzedzać <tt>ensure</tt>.
<noinclude>
{{ProstaNawigacja|spis=Ruby|poprzart=Ruby/Przetwarzanie wyjątków: rescue|poprz=Przetwarzanie wyjątków: rescue|nastart=Ruby/Akcesory|nast=Akcesory}}