技術頻道導航
HTML/CSS
.NET技術
IIS技術
PHP技術
Js/JQuery
Photoshop
Fireworks
服務器技術
操作系統(tǒng)
網(wǎng)站運營

贊助商

分類目錄

贊助商

最新文章

搜索

[C#技巧]C#異常when過濾器捕捉異常使用多個catch的示例代碼

作者:admin    時間:2023-5-6 11:21:52    瀏覽:

你的代碼中是否存在需要多次處理特定異常的情況?我們經(jīng)常會遇到這樣的情況,我們必須根據(jù)某種條件執(zhí)行不同的異常處理邏輯。

假設我們想在捕捉異常HttpRequestException時,StatusCode=400Bad Request)時以一種方式處理,而StatusCode=404Not Found)時以另一種方式處理,你可能想到編寫一個 if 語句來檢查條件:

try
{
    await GetBlogsFromApi();
}
catch (HttpRequestException e)
{
    if (e.StatusCode == HttpStatusCode.BadRequest)
    {
        HandleBadRequest(e);
    }
    else if (e.StatusCode == HttpStatusCode.NotFound)
    {
        HandleNotFound(e);
    }
}

雖然這可行,但它不是最干凈的方法,有一個你可能不知道的更好的解決方案。

實際上,try-catch可以使用多個catch字句,發(fā)生異常時,按指定順序從上到下檢查 catch 子句。但是,對于任何拋出的異常,最多只catch執(zhí)行一個塊。如前例所示,你可以省略異常變量的聲明并在 catch 子句中僅指定異常類型。沒有任何指定異常類型的 catch 子句匹配任何異常,如果存在,則必須是最后一個 catch 子句。

以下是我們?nèi)绾胃鶕?jù)特定條件優(yōu)雅地捕獲相同的異常:

try
{
    await GetBlogsFromApi();
}
catch (HttpRequestException e) when (e.StatusCode == HttpStatusCode.BadRequest)
{
    HandleBadRequest(e);
}
catch (HttpRequestException e) when (e.StatusCode == HttpStatusCode.NotFound)
{
    HandleNotFound(e);
}

這個就是異常when過濾器,使用異常過濾器來提供單個catch塊來處理兩種指定類型的異常。

如果它們通過異常過濾器區(qū)分catch,你可以為相同的異常類型提供多個子句,其中一個子句可能沒有異常過濾器。如果存在這樣的子句,它必須是指定該異常類型的子句的最后一個。除了異常類型,你可以指定一個異常過濾器,進一步檢查異常并決定相應的catch塊是否處理該異常。

異常過濾器是關鍵字后面的布爾表達式when,當我們需要添加更多條件時,這種方法更簡潔、更容易擴展。

如果要重新拋出捕獲的異常,請使用throw語句,如以下示例所示:

try
{
    var result = Process(-3, 4);
    Console.WriteLine($"Processing succeeded: {result}");
}
catch (Exception e)
{
    LogError(e, "Processing failed.");
    throw;
}

注意
throw;保留異常的原始堆棧跟蹤,它存儲在Exception.StackTrace屬性中,與此相反,throw e;更新 的StackTrace屬性e。 參考文章:
[C#技巧]C#重新拋出異常的正確方法,注意不是throw e!

相關文章

x
  • 站長推薦
/* 左側(cè)顯示文章內(nèi)容目錄 */