Trong một số tình huống chúng ta cần phải thực hiện bất cứ khi nào một ngoại lệ được phát sinh ra, ví dụ như việc đóng một tập tin. Để làm việc này chúng ta có thể đặt câu lệnh trong cả hai khối try và catch. Tuy nhiên có một cách giải quyết tốt hơn, đó là sử dụng câu lệnh Finnally. Các hành động đặt trong khối finnally sẽ luôn được thực hiện mà không cần quan tâm tới việc có hay không một ngoại lệ phát sinh trong chương trình.
Chúng ta cùng xét ví dụ sau: using System; namespace Programming_CSharp {
public class Test {
public static void Main() {
t.TestFunc();
Console.ReadLine(); }
// chia hai số và xử lý ngoại lệ nếu có public void TestFunc()
{ try { Console.WriteLine("mở file"); double a = 5; double b = 0; Console.WriteLine("{0} /{1} = {2}", a, b, DoDivide(a,b)); Console.WriteLine("dòng này có thể xuất hiện hoặc không"); }
catch (System.DivideByZeroException) {
Console.WriteLine("lỗi chia cho 0!"); }
catch {
Console.WriteLine("không có ngoại lệ"); } finally { Console.WriteLine("Đóng tệp."); } }
// thực hiện chia nếu hợp lệ
public double DoDivide(double a, double b) {
if ( b == 0) {
thrownew System.DivideByZeroException(); }
if ( a == 0) {
thrownew System.ArithmeticException(); } return a/b; } } }
Đầu tiên hãy gán a= 5 và b=0 chạy chương trình Bạn sẽ thấy lệnh Console.WriteLine("dòng này có thể xuất hiện hoặc không");
Sẽ không được thực hiện do xuất hiện một ngoại lệ là lỗi chia cho 0 và chương trình sẽ tìm tới phần xử lý ngoại lệ này
mà bỏ qua phần lệnh tiếp theo.
Sau đó bạn thay đổi giá trị b=12 và chạy chương trình thì lệnh
Console.WriteLine("dòng này có thể xuất hiện hoặc không"); được thực hiện.
Tuy nhiên ở cả 2 trường hợp bạn đề thấy thực hiện lệnh Console.WriteLine("Đóng tệp.");
Đó là vì lệnh này đã được đặt trong khối Finally.
Nắm được cách xử lý ngoại lệ qua việc sử dụng các câu lệnh throw, catch và finally sẽ giúp bạn lập trình có hiệu quả hơn.