Vẫn cuộn xuống? Của bạn đây!
Câu hỏi này đã cho tôi một khoảng thời gian khó khăn.
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");
những gì sẽ được in trong kịch bản trên? Có đoán nó đúng:
ví dụ: Tin nhắn - bất kể nó là gì (có thể đã cố gắng chia cho 0)
Cuối cùng là khối
Sau cùng
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");
Điều này sẽ in gì? Không có gì! Nó tạo ra một lỗi vì khối bắt lỗi tạo ra lỗi.
Trong một cấu trúc lập trình tốt, các ngoại lệ của bạn sẽ được sắp xếp theo nghĩa là mã này sẽ được xử lý từ một lớp khác. Để kích thích một trường hợp như vậy, tôi sẽ lồng nhau thử mã này.
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);
}
Trong trường hợp này, đầu ra sẽ là:
- Cuối cùng là khối
- ví dụ: Tin nhắn - bất kể nó là gì.
Rõ ràng là khi bạn bắt một ngoại lệ và ném lại vào các lớp khác (Funneling), mã sau khi ném sẽ không được thực thi. Nó hoạt động tương tự như cách trả về bên trong một hàm hoạt động.
Bây giờ bạn biết tại sao không đóng tài nguyên của mình trên các mã sau khối bắt. Hãy đặt chúng vào khối cuối cùng.