我知道等待不能用在catch子句中。 但是我還沒有真正面臨與此有關的問題,直到現在...。尋找工作環繞
基本上我有一個層負責接收傳入的請求,處理它們,從它們構建消息並將消息傳遞到另一層負責發送消息。
如果在發送消息過程中出現問題,則會引發自定義異常並由消息發送層捕獲。此時,應該在DB中插入此消息的失敗記錄(需要一些時間,如async),並且應該將異常傳播到負責向發出請求的客戶端發送錯誤響應的上層。
這裏是下面說明的目的一些非常簡化的代碼:
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;
}
}
當然請求處理層一無所知DB,它只是在電荷建立消息時,將消息傳遞給消息處理層,並向客戶端發送響應(正面或負面)。
所以我認爲它是有道理的......如果發生異常,我的「業務」層希望在數據庫中插入一個失敗記錄並重新拋出異常,以便「請求」處理層可以做必要的事情上下文,向客戶端發送否定響應)。
是否應該以這種方式使用異常?對我來說這似乎很乾淨,但是我不能在catch子句中等待這一事實,這讓我認爲設計中可能存在代碼異味(即使我在一層中處理異常然後重新推出它以用於上層做一些不同的處理以及對我來說聽起來像是正是例外情況)。
圍繞這個有什麼想法嗎?
謝謝!
好像你可以在發送層捕獲異常,並簡單地返回一個狀態對象給調用者。你甚至可以使這個狀態對象的一個字段成爲'Exception'類型,這樣如果需要的話,它可以被重新拋出。 – dlev
你爲什麼不直接調用這個函數而不等它呢? – Rafael
@dlev:感謝這個想法,對於我來說,在某些地方混合返回狀態並在其他地方使用例外情況仍然感覺不太好。必須在返回狀態代碼(或對象)或拋出異常之間作出選擇,但不要混合兩者(這是我記得從「良好」報告錯誤設計準則中得到的結果)。 – darkey