Tôi biết rằng chờ đợi không thể được sử dụng trong điều khoản bắt. Tuy nhiên, tôi chưa thực sự gặp phải vấn đề nào liên quan đến điều này, cho đến bây giờ ...đang chờ bị cấm trong điều khoản bắt. Tìm kiếm một công việc arround
Về cơ bản tôi có một lớp chịu trách nhiệm nhận các yêu cầu gửi đến, xử lý chúng, tạo tin nhắn từ họ và truyền tin nhắn đến một lớp khác chịu trách nhiệm gửi tin nhắn.
Nếu xảy ra sự cố trong khi gửi thư, ngoại lệ tùy chỉnh sẽ được ném và bị lớp gửi thư gửi đi. Tại thời điểm này, một bản ghi lỗi cho thông báo này sẽ được chèn vào trong DB (mất một thời gian, do đó, không đồng bộ) và ngoại lệ sẽ được nhân lên tầng trên, phụ trách gửi phản hồi lỗi cho máy khách đã đưa ra yêu cầu .
Dưới đây là một số mã rất đơn giản với mục đích minh họa dưới đây:
public async Task ProcessRequestAsync(Request req)
{
int statusCode = 0;
try
{
await SendMessageAsync(new Message(req));
}
catch(MyCustomException ex)
{
statusCode = ex.ErrorCode;
}
await SendReponseToClientAsync(req, statusCode);
}
public async Task SendMessageAsync(Message msg)
{
try
{
// Some async operations done here
}
catch (MyCustomException ex)
{
await InsertFailureForMessageInDbAsync(msg, ex.ErrorCode); // CAN'T DO THAT
throw;
}
}
Tất nhiên lớp xử lý yêu cầu không biết gì về DB, nó chỉ là chịu trách nhiệm về việc xây dựng một thông điệp, đi qua các thông điệp tới thông điệp xử lý lớp, và gửi một phản ứng cho khách hàng (tích cực hoặc tiêu cực). Vì vậy, tôi nghĩ rằng nó có ý nghĩa ... Nếu một ngoại lệ xảy ra, lớp "kinh doanh" của tôi muốn chèn một bản ghi thất bại trong DB và rethrow ngoại lệ để các "yêu cầu" chế biến lớp có thể làm những gì cần thiết (trong này bối cảnh, gửi một phản hồi tiêu cực trở lại cho khách hàng).
Trường hợp ngoại lệ không được sử dụng theo cách này? Nó có vẻ sạch sẽ với tôi nhưng thực tế là tôi không thể làm điều này chờ đợi trong điều khoản bắt làm cho tôi nghĩ rằng có thể một mùi mã với thiết kế (ngay cả khi tôi ý tưởng xử lý ngoại lệ trong một lớp sau đó rethrowing nó cho lớp trên để làm một số xử lý khác nhau cũng như âm thanh với tôi như nó chính xác những gì ngoại lệ được thực hiện cho).
Có ý tưởng nào xảy ra với điều này không?
Cảm ơn!
Có vẻ như bạn có thể bắt ngoại lệ trong lớp gửi và chỉ cần trả về đối tượng trạng thái cho người gọi. Bạn thậm chí có thể tạo một trường của đối tượng trạng thái này thuộc kiểu 'Exception' để nó có thể được ném lại sau nếu cần thiết. – dlev
Tại sao bạn không chỉ gọi chức năng và không chờ đợi nó? – Rafael
@dlev: Cảm ơn ý tưởng này, vẫn không cảm thấy thực sự tốt với tôi để trộn trạng thái trở lại ở một số nơi và sử dụng ngoại lệ ở nơi khác. Sự lựa chọn phải được thực hiện giữa trả lại mã trạng thái (hoặc đối tượng) hoặc ném ngoại lệ, nhưng không trộn lẫn cả hai (đó là những gì tôi nhớ từ hướng dẫn thiết kế "tốt" cho các lỗi báo cáo). – darkey