Wciąż przewijasz w dół? Proszę bardzo!
To pytanie dawało mi trudny czas.
try
{
int a=1;
int b=0;
int c=a/b;
}
catch(Exception ex)
{
console.writeline(ex.Message);
}
finally
{
console.writeline("Finally block");
}
console.writeline("After finally");
co zostałoby wydrukowane w powyższym scenariuszu? Tak, zgadłem:
np. wiadomość - cokolwiek to jest (prawdopodobnie próba podzielenia przez zero)
Wreszcie blok
W końcu
try
{
int a=1;
int b=0;
int c=a/b;
}
catch(Exception ex)
{
throw(ex);
}
finally
{
console.writeline("Finally block");
}
console.writeline("After finally");
Co by to wydrukowało? Nic! Zgłasza błąd, ponieważ blok catch wywołał błąd.
W dobrej strukturze programowania twoje wyjątki byłyby lejkami, w tym sensie, że ten kod będzie obsługiwany z innej warstwy. Aby stymulować taki przypadek, zagnieżdżę ten kod.
try
{
try
{
int a=1;
int b=0;
int c=a/b;
}
catch(Exception ex)
{
throw(ex);
}
finally
{
console.writeline("Finally block")
}
console.writeline("After finally");
}
catch(Exception ex)
{
console.writeline(ex.Message);
}
W tym przypadku wynik wyglądałby następująco:
- Wreszcie blok
- np. wiadomość - cokolwiek to jest.
Oczywiste jest, że gdy wychwycisz wyjątek i wrzucisz go ponownie do innych warstw (lejkowanie), kod po rzucie nie zostanie wykonany. Działa podobnie do tego, jak działa powrót wewnątrz funkcji.
Teraz wiesz, dlaczego nie zamknąć zasobów na kodach po bloku catch i umieścić je w bloku final.