Ruby/Przetwarzanie wyjątków: rescue: Różnice pomiędzy wersjami
Usunięta treść Dodana treść
m nav |
Szymon wro (dyskusja | edycje) Nie podano opisu zmian |
||
Linia 1:
== Przetwarzanie wyjątków: rescue ==
Wykonujący się program może napotkać niespodziewane problemy. Plik, które chce odczytać może nie istnieć, dysk może być pełny, gdy program chce zapisać trochę danych, a użytkownik może wprowadzać niepoprawny rodzaj danych wejściowych.
<pre>
ruby> file = open("some_file")
ERR: (eval):1:in `open': No such file or directory - some_file
</pre>
Solidny program powinien radzić sobie z takimi sytuacjami sensownie i wdzięcznie. Sprostanie temu wymaganiu może być irytującym zadaniem. Od programistów języka C oczekuje się sprawdzania wyniku każdego wywołania systemowego które potencjalnie mogło się nie powieść oraz natychmiastowego zdecydowanie, co należy zrobić:
<pre>
FILE *file = fopen("some_file", "r");
if (file == NULL) {
Linia 16 ⟶ 21:
}
...
</pre>
Jest to bardzo męcząca praktyka, którą programiści mają w zwyczaju traktować niedbale i pomijać, czego rezultatem jest to, że program nie radzi sobie dobrze z wyjątkami. Z drugiej strony, dobre wykonanie tej pracy czyni programy trudnymi do czytania, ponieważ duża ilość kodu obsługującego wyjątki przesłania właściwy kod.
W Rubim, tak jak w wielu współczesnych językach programowania, możemy radzić sobie z wyjątkami poszczególnych bloków kodu rozdzielnie, lecz w taka praca z niespodziankami skutecznie acz nie nadmiernie obciąża programistę lub każdego, kto później będzie czytał kod. Blok kodu oznaczony oznaczony słowem <tt>begin</tt> wykonuje się dopóki nie napotka na wyjątek, które powoduje przekierowanie kontroli do bloku zarządzania błędami, który jest oznaczony przez <tt>rescue</tt>. Jeżeli nie wystąpi żaden wyjątek, kod z bloku <tt>rescue</tt> nie jest używany. Następująca metoda zwraca pierwszą linię z pliku tekstowego lub <tt>nil</tt> jeżeli napotka wyjątek:
<pre>
def first_line( filename )
begin
Linia 26 ⟶ 33:
info = file.gets
file.close
info #
rescue
nil #
end
end
</pre>
Będą występować sytuacje, gdy będziemy chcieli móc kreatywnie pracować nad problemem. Tutaj, jeśli plik, który żądamy jest niedostępny, możemy spróbować użyć standardowego wejścia:
<pre>
begin
file = open("some_file")
Linia 45 ⟶ 54:
# ... and deal with any other exceptions here.
end
</pre>
Słowo kluczowe <tt>retry</tt> może być używane w bloku <tt>rescue</tt>, by wystartować blok <tt>begin</tt> od początku. Pozwala to nam przepisać poprzedni przykład nieco zwięźlej:
<pre>
fname = "some_file"
begin
Linia 56 ⟶ 67:
retry
end
</pre>
Jednakże, mamy tutaj pewną wadę. Nieistniejący plik sprawi, że pętla ta będzie powtarzana w nieskończoność. Musisz zwracać uwagę na tego rodzaju pułapki podczas przetwarzania wyjątków.
Każda biblioteka Rubiego podnosi wyjątek jeśli wystąpi jakiś błąd. Ty również możesz podnosić wyjątki jawnie w twoim kodzie. By podnieść wyjątek użyj słowa kluczowego <tt>raise</tt>. Przyjmuje ono jeden argument, którym powinien być łańcuch znakowy opisujący wyjątek. Argument jest wprawdzie opcjonalny, jednak nie powinien być pomijany. Będzie on mógł być później dostępny za pomocą specjalnej zmiennej globalnej <tt>$!</tt>.
<pre>
ruby> raise "test error"
test error
Linia 70 ⟶ 83:
An error occurred: test2
nil
</pre>
<noinclude>
{{ProstaNawigacja|spis=Ruby|poprzart=Ruby/Stałe klasowe|poprz=Stałe klasowe|nastart=Ruby/Przetwarzanie wyjątków: ensure|nast=Przetwarzanie wyjątków: ensure}}
|