Exception (ngoại lệ) là mô hình xử lý lỗi chính trong .NET. Các exception có ưu điểm là thông tin lỗi không cần phải được khai báo trong method signature hoặc phải được trả về trong các phương thức.
Đoạn code sau mô tả một cách sử dụng tiêu biểu:
try
{
var lines = await File.ReadAllLinesAsync(file);
Console.WriteLine($"The {file} has {lines.Length} lines.");
}
catch (Exception e) when (e is FileNotFoundException or DirectoryNotFoundException)
{
Console.WriteLine($"{file} doesn't exist.");
}
Xử lý các exception một cách đúng đắn là điều cần thiết cho độ tin cậy của ứng dụng. Các exception dự kiến có thể được xử lý có chủ ý trong code của người dùng, ngược tại, ứng dụng sẽ bị crash. Một ứng dụng bị crash vẫn đáng tin cậy hơn một ứng dụng có hành vi không xác định. Nó cũng dễ chẩn đoán hơn khi bạn muốn tìm ra nguyên nhân cốt lõi của vấn đề.
Các exception được đưa ra từ điểm xảy ra lỗi và tự động thu thập thông tin chẩn đoán bổ sung về trạng thái của chương trình. Thông tin này được sử dụng trong quá trình debug, khi khả năng theo dõi ứng dụng và có thể dùng để gỡ lỗi sau khi ứng dụng đã kết thúc. Mỗi phương pháp chẩn đoán này đều nhờ vào những thông tin lỗi phong phú và trạng thái ứng dụng để chẩn đoán các sự cố.
Exception chỉ dành cho các tình huống hiếm gặp. Điều này một phần là do chúng có chi phí hiệu suất tương đối cao. Chúng không nhằm mục đích sử dụng cho luồng điều khiển, mặc dù đôi khi chúng được sử dụng theo cách đó.
Các ngoại lệ được sử dụng (một phần) để hủy bỏ. Chúng cho phép tạm dừng thực thi một cách hiệu quả và unwinding a callstack (quá trình pop dữ liệu trên stack để đưa nó về trạng thái ban đầu) đang hoạt động sau khi yêu cầu hủy được quan sát thấy.
try
{
await source.CopyToAsync(destination, cancellationToken);
}
catch (OperationCanceledException)
{
Console.WriteLine("Operation was canceled");
}
Các .NET design pattern có những dạng xử lý lỗi thay thế cho các tình huống khi chi phí hiệu suất của exception quá cao. Ví dụ: int.TryParse trả về một bool, với tham số out chứa số nguyên hợp lệ được phân tích cú pháp khi thành công. Dictionary.TryGetValue cung cấp một mô hình tương tự, trả về loại TValue hợp lệ dưới dạng tham số out trong trường hợp true.
Việc xử lý lỗi và chẩn đoán nói chung được triển khai thông qua các low-level runtime API, thư viện cấp cao hơn và các công cụ. Những khả năng này được thiết kế để hỗ trợ các tùy chọn triển khai mới hơn như container. Ví dụ: dotnet-monitor có thể xuất dữ liệu thời gian chạy từ ứng dụng sang listener thông qua máy chủ web phục vụ việc chẩn đoán được tích hợp sẵn.