Tôi chưa bao giờ hoàn toàn hài lòng với cách xử lý ngoại lệ, có rất nhiều ngoại lệ và try/catch mang đến bảng (stack unwinding, vv), nhưng dường như phá vỡ rất nhiều mô hình OO trong quá trình .Giảm mã xử lý lỗi trùng lặp trong C#?
Dù sao, đây là vấn đề:
Hãy nói rằng bạn có một số lớp bao bọc hoặc bao gồm tập tin mạng hoạt động IO (ví dụ: đọc và viết một số tập tin tại một số đường dẫn UNC đặc biệt nơi nào đó). Vì nhiều lý do bạn không muốn những hoạt động IO thất bại, vì vậy nếu bạn phát hiện ra rằng chúng không thành công, bạn thử lại chúng và bạn tiếp tục thử lại cho đến khi chúng thành công hoặc bạn đạt đến thời gian chờ. Tôi đã có một lớp RetryTimer tiện lợi mà tôi có thể khởi tạo và sử dụng để ngủ chủ đề hiện tại giữa các lần thử lại và xác định khi nào hết thời gian chờ, v.v.
Vấn đề là bạn có một loạt hoạt động IO theo một số phương pháp lớp này, và bạn cần phải quấn từng lớp trong logic thử try-catch/retry.
Dưới đây là một ví dụ đoạn mã:
RetryTimer fileIORetryTimer = new RetryTimer(TimeSpan.FromHours(10));
bool success = false;
while (!success)
{
try
{
// do some file IO which may succeed or fail
success = true;
}
catch (IOException e)
{
if (fileIORetryTimer.HasExceededRetryTimeout)
{
throw e;
}
fileIORetryTimer.SleepUntilNextRetry();
}
}
Vì vậy, làm thế nào để bạn tránh sao chép hầu hết các mã này cho mỗi tập tin hoạt động IO trong suốt lớp học? Giải pháp của tôi là sử dụng các khối đại biểu ẩn danh và một phương thức duy nhất trong lớp đã thực thi khối ủy nhiệm được truyền cho nó. Điều này cho phép tôi thực hiện những việc như thế này theo các phương pháp khác:
this.RetryFileIO(delegate()
{
// some code block
});
Tôi thích điều này một chút, nhưng rất nhiều điều mong muốn. Tôi muốn nghe người khác giải quyết vấn đề như thế nào.
Chỉ là một FYI chung: Đó là [gần như luôn luôn * tốt hơn] (http://philosopherdeveloper.wordpress.com/2010/05/05/re-throwing-caught-exceptions/) chỉ đơn giản là 'ném; 'thay vào đó của 'throw e; ' –