Tham khảo tài liệu ''giáo trình phân tích khả năng truy cập các thành phần tùy biến trong mảng có kích thước khác nhau p10'', công nghệ thông tin, kỹ thuật lập trình phục vụ nhu cầu học tập, nghiên cứu và làm việc hiệu quả
Ngơn Ngữ Lập Trình C# public static void Main() { Console.WriteLine(“Enter Main ”); Test t = new Test(); t.Func1(); Console.WriteLine(“Exit Main ”); } public void Func1() { Console.WriteLine(“Enter Func1 ”); Func2(); Console.WriteLine(“Exit Func1 ”); } public void Func2() { Console.WriteLine(“Enter Func2 ”); throw new System.Exception(); Console.WriteLine(“Exit Func2 ”); } } } Kết quả: Enter Main Enter Func1 Enter Func2 Exception occurred: System.Exception: An exception of type System.Exception was throw at Programming_CSharp.Test.Func2() in exception01.cs:line 26 at Programming_CSharp.Test.Func1() in exception01.cs:line 20 at Programming_CSharp.Test.Main() in exception01.cs:line 12 Ví dụ minh họa đơn giản viết hình console thơng tin nhập vào hàm chuẩn bị từ hàm Hàm Main() tạo thể kiểu Test sau gọi hàm Func1() Sau in thông điệp “Enter Func1”, hàm Func1() gọi hàm Func2() Hàm Func2() in thông điệp phát sinh ngoại lệ kiểu System.Exception Việc thực thi ngưng tức khắc, CLR tìm kiếm trình xử lý ngoại lệ hàm Func2() Do khơng tìm thấy đây, CLR tiếp tục vào stack lấy hàm gọi trước tức Func1 tìm kiếm 367 Xử Lý Ngoại Lệ Ngơn Ngữ Lập Trình C# trình xử lý ngoại lệ Một lần Func1 khơng có đoạn xử lý ngoại lệ Và CLR trả hàm Main Tại hàm Main khơng có, nên CLR gọi trình mặc định xử lý ngoại lệ, việc đơn giản xuất thông điệp lỗi Câu lệnh catch Trong C#, trình xử lý ngoại lệ hay đoạn chương trình xử lý ngoại lệ gọi khối catch tạo với từ khóa catch Trong ví dụ 13.2 sau, câu lệnh throw thực thi bên khối try, khối catch sử dụng để công bố lỗi xử lý Ví dụ 13.2: bắt giữ ngoại lệ namespace Programming_CSharp { using System; public class Test { public static void Main() { Console.WriteLine(“Enter Main ”); Test t = new Test(); t.Func1(); Console.WriteLine(“Exit Main ”); } public void Func1() { Console.WriteLine(“Enter Func1 ”); Func2(); Console.WriteLine(“Exit Func1 ”); } public void Func2() { Console.WriteLine(“Enter Func2 ”); try { Console.WriteLine(“Entering try block ”); throw new System.Exception(); Console.WriteLine(“Exiting try block ”); } 368 Xử Lý Ngoại Lệ Ngôn Ngữ Lập Trình C# catch { Console.WriteLine(“Exception caught and handled.”); } Console.WriteLine(“Exit Func2 ”); } } } Kết quả: Enter Main Enter Func1 Enter Func2 Entering try block Exception caught and handled Exit Func2 Exit Func1 Exit Main Ví dụ 13.2 tương tự ví dụ minh họa 13.1 ngoại trừ chương trình thêm vào khối try/catch Thông thường co thể đặt khối try bao quanh đoạn chương trình tiềm ẩn gây nguy hiểm, việc truy cập file, cấp phát nhớ Theo sau khối try câu lệnh catch tổng quát Câu lệnh catch ví dụ tổng qt không xác định loại ngoại lệ mà bắt giữ Trong trường hợp tổng quát khối catch bắt giữ ngoại lệ phát sinh Sử dụng câu lệnh catch để bắt giữ ngoại lệ xác định thảo luận phần sau chương Trong ví dụ 13.2 này, khối catch đơn giản thông báo ngoại lệ bắt giữ xử lý Trong ví dụ giới thực, đưa hành động để sửa chữa vấn đề mà gây ngoại lệ Ví dụ, người sử dụng cố mở tập tin có thuộc tính đọc, gọi phương thức cho phép người dùng thay đổi thuộc tính tập tin Nếu chương trình thực thiếu nhớ, phát sinh cho người dùng hội để đóng bớt ứng dụng khác lại Thậm chí trường hợp xấu ta khơng khắc phục khối catch in thơng điệp lỗi để người dùng biết Thử kiểm tra kỹ lại chương trình 13.2 trên, thấy xuất đoạn mã vào hàm Main(), Func1(), Func2(), khối try Chúng ta khơng thấy khối lệnh try (tức in thơng báo “Exiting try block ”, hay thực lệnh này), theo thứ tự Func2(), Func1(), Main() Chuyện xảy ra? 369 Xử Lý Ngoại Lệ Ngơn Ngữ Lập Trình C# Khi ngoại lệ phát sinh, việc thi hành bị tạm dừng việc thi hành chuyển qua khối lệnh catch Nó khơng trả luồng thực ban đầu, tức lệnh sau phát ngoại lệ khối try không thực Trong trường hợp không nhận thông báo “Exiting try block ” Khối lệnh catch xử lý lỗi sau chuyển việc thực thi chương trình đến lệnh tiếp sau khối catch Ở khơng có việc quay lại gọi hàm trước stack Ngoại lệ xử lý, khơng có vấn đề xảy ra, chương trình tiếp tục hoạt động bình thường Điều trở nên rõ ràng di chuyển khối try/catch lên hàm Func1 ví dụ minh họa 13.3 bên Ví dụ 13.3: Catch hàm gọi namespace Programming_CSharp { using System; public class Test { public static void Main() { Console.WriteLine(“Enter Main ”); Test t = new Test(); t.Func1(); Console.WriteLine(“Exit Main ”); } public void Func1() { Console.WriteLine(“Enter Func1 ”); try { Console.WriteLine(“Entering try block ”); Func2(); Console.WriteLine(“Exiting try block ”); } catch { Console.WriteLine(“Exception caught and handled.”); } Console.WriteLine(“Exit Func1 ”); 370 Xử Lý Ngoại Lệ Ngơn Ngữ Lập Trình C# } public void Func2() { Console.WriteLine(“Enter Func2 ”); throw new System.Exception(); Console.WriteLine(“Exit Func2 ”); } } } Kết quả: Enter Main Enter Func1 Entering try block Enter Func2 Exception caught and handled Exit Func1 Exit Main Lúc ngoại lệ không xử lý bên hàm Func2(), mà xử lý bên hàm Func1() Khi hàm Func2() gọi, in câu lệnh thơng báo vào hàm phát sinh ngoại lệ Việc thực chương trình bị ngưng, CLR tìm kiếm phần xử lý ngoại lệ, hàm khơng có CLR vào stack lấy hàm gọi trường hợp Func1() Câu lệnh catch gọi, việc thực thi tiếp tục thực bình thường sau câu lệnh catch Hãy chắn hiểu rõ câu lệnh “Exiting try block” “Exit Func2” khơng in Chúng ta dùng cách cũ để kiểm tra việc cách dùng chương trình debug cho chương trình chạy bước để tìm hiểu rõ Tạo khối catch xác định: Cho đến dùng khối catch tổng quát, tức với ngoại lệ Tuy nhiên tạo khối catch xác định để xử lý vài ngoại lệ khơng phải tồn ngoại lệ, dựa kiểu ngoại lệ phát sinh Ví dụ 13.4 minh họa cách xác định loại ngoại lệ mà xử lý Ví dụ13.4: Xác định ngoại lệ để bắt namespace Programming_CSharp { using System; public class Test Xử Lý Ngoại Lệ 371 ... Ngơn Ngữ Lập Trình C# trình xử lý ngoại lệ Một lần Func1 khơng có đoạn xử lý ngoại lệ Và CLR trả hàm Main Tại hàm Main khơng có, nên CLR gọi trình mặc định xử lý ngoại lệ, việc... đơn giản xuất thông điệp lỗi Câu lệnh catch Trong C#, trình xử lý ngoại lệ hay đoạn chương trình xử lý ngoại lệ gọi khối catch tạo với từ khóa catch Trong ví dụ 13.2 sau, câu lệnh throw thực thi... dụ minh họa 13.1 ngoại trừ chương trình thêm vào khối try/catch Thông thường co thể đặt khối try bao quanh đoạn chương trình tiềm ẩn gây nguy hiểm, việc truy cập file, cấp phát nhớ Theo sau khối