Bài đăng nổi bật


Giới thiệu Xử lý ngoại lệ

Giới thiệu Xử lý ngoại lệ

Ngoại lệ
Theo truyền thống, các ứng dụng sử dụng khái niệm về một đối tượng lỗi global. Khi một đoạn mã gây ra lỗi, nó sẽ đặt dữ liệu trong đối tượng này để chỉ ra nguyên nhân lỗi và sau đó quay lại người gọi. Trách nhiệm của mã gọi là kiểm tra đối tượng lỗi và xác định cách xử lý nó. Tuy nhiên, cách tiếp cận này không mạnh mẽ, vì quá dễ để lập trình viên quên xử lý lỗi một cách thích hợp.
.NET Framework sử dụng các ngoại lệ để giúp khắc phục những vấn đề này. Một ngoại lệ là một dấu hiệu của một lỗi hoặc điều kiện đặc biệt. Một phương thức có thể đưa ra một ngoại lệ khi phát hiện ra điều gì đó bất ngờ đã xảy ra, ví dụ, ứng dụng cố gắng mở một tệp không tồn tại.

Exception Propagation
Tuyên truyền ngoại lệ

Lan truyền
Khi một phương thức đưa ra một ngoại lệ, mã cuộc gọi phải được chuẩn bị để phát hiện và xử lý ngoại lệ này. Nếu mã gọi không phát hiện ngoại lệ, mã sẽ bị hủy bỏ và ngoại lệ được tự động truyền đến mã đã gọi mã gọi. Quá trình này tiếp tục cho đến khi một phần của mã chịu trách nhiệm xử lý ngoại lệ. Việc thực thi tiếp tục trong phần mã này sau khi logic xử lý ngoại lệ đã hoàn thành. Nếu không có mã nào xử lý ngoại lệ, thì quá trình sẽ chấm dứt và hiển thị thông báo cho người dùng.
Điều này đôi khi cũng được gọi là chuyển ngoại lệ lên ngăn xếp hoặc lên ngăn xếp cuộc gọi.
Handling Exceptions

Xử lý ngoại lệ
Khối try/catch là cấu trúc lập trình chính cho phép bạn thực hiện xử lý ngoại lệ có cấu trúc trong các ứng dụng được viết bằng C#.
Bạn bọc đoạn mã có thể bị lỗi và gây ra ngoại lệ trong một khối try và thêm một hoặc nhiều khối catch để xử lý bất kỳ trường hợp ngoại lệ nào có thể xảy ra. Chiến lược được khuyến nghị tuân theo các khối try trước là bắt các ngoại lệ cụ thể hơn trước và các ngoại lệ chung hơn cuối cùng.
Ví dụ: nếu bạn muốn chạy qua một ngoại lệ xung quanh quyền truy cập tệp, bạn sẽ bắt FileNotFoundException trong khối try đầu tiên và sau đó có thể tạo một khối try thứ hai sẽ theo dõi lớp Exception chung để bắt bất kỳ ngoại lệ nào khác ngoài FileNotFoundException.
Nếu FileNotFoundException được kích hoạt, khối catch đó sẽ có mã để xử lý ngoại lệ. Mặt khác, (các) khối catch khác sẽ chứa mã để xử lý các ngoại lệ khác hoặc ném ngoại lệ sao lưu ngăn xếp vào ứng dụng gọi đến.
Ví dụ mã sau đây cho thấy cú pháp để xác định khối try/catch.
try
{
    // Try block.
}
catch (FileNotFoundException fnfEx)
{
    // Catch block 1.
}
catch (Exception e)
{
    // Catch block n.
}


The finally Block
Using Finally
Một số phương thức có thể chứa mã quan trọng phải luôn được chạy, ngay cả khi xảy ra ngoại lệ chưa xử lý. Ví dụ, một phương thức có thể cần đảm bảo rằng nó đóng một tệp mà nó đang ghi hoặc giải phóng một số tài nguyên khác trước khi nó kết thúc. Một khối finally cho phép bạn xử lý tình huống này.
Bạn chỉ định một finally block sau bất kỳ trình xử lý catch trong một khối try/catch. Nó chỉ định mã phải được thực hiện khi khối kết thúc, bất kể mọi trường hợp ngoại lệ, xử lý hoặc không xử lý, xảy ra. Nếu một ngoại lệ được bắt và xử lý, trình xử lý ngoại lệ trong khối catch sẽ chạy trước khối finally.
Bạn cũng có thể thêm một khối finally vào mã không có khối try. Trong trường hợp này, tất cả các ngoại lệ đều không được xử lý, nhưng khối finally sẽ luôn luôn chạy.
Ví dụ mã sau đây cho thấy cách triển khai khối try/catch/finally.
try
{
}
catch (NullReferenceException ex)
{
    // Catch all NullReferenceException exceptions.
}
catch (Exception ex)
{
    // Catch all other exceptions.
}
finally
{
   // Code that always runs to close files or release resources.
}

Throwing Exceptions
 Bookmark this page

Throwing Exceptions
Ném ngoại lệ


Ném ngoại lệ
Bạn có thể tạo một thể hiện của một lớp Exception trong mã của bạn và ném ngoại lệ để chỉ ra rằng một ngoại lệ đã xảy ra. Khi bạn ném một ngoại lệ, việc thực thi khối mã hiện tại chấm dứt và CLR chuyển điều khiển sang trình xử lý ngoại lệ có sẵn đầu tiên bắt được ngoại lệ đó.
Để ném một ngoại lệ, bạn sử dụng các từ khoá throw và chỉ định đối tượng ngoại lệ để ném.s
Ví dụ mã sau đây cho thấy cách tạo một thể hiện của các NullReferenceException lớp học và sau đó ném các ex.
var ex = new NullReferenceException("The 'Name' parameter is null.");
throw ex;
Chiến lược chung là cho một phương thức hoặc khối mã để bắt bất kỳ trường hợp ngoại lệ nào và cố gắng xử lý chúng. Nếu khối try cho một ngoại lệ không thể giải quyết lỗi, nó có thể chia lại ngoại lệ để truyền nó tới mã gọi.
Ví dụ mã sau đây cho thấy cách lấy lại một ngoại lệ đã bị bắt trong một khối try.
try
{
   // Code that could cause an exception
}
catch (NullReferenceException ex)
{
    // Catch all NullReferenceException exceptions.
}
catch (Exception ex)
{
    // Attempt to handle the exception
    ...
    // If this catch handler cannot resolve the exception, 
    // throw it to the calling code
    throw;
}

Post a Comment

أحدث أقدم