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

贊助商

分類目錄

贊助商

最新文章

搜索

[C#技巧]C#重新拋出異常的正確方法,注意不是throw e!

作者:admin    時間:2023-5-6 10:58:17    瀏覽:

異常處理是我們代碼的一個非常重要的方面。我們經(jīng)??梢钥吹皆诖a庫中重復(fù)的一種模式是捕獲異常,在本地處理它,然后將其重新拋給更高級別的組件。

重新拋出步驟是我們很容易犯錯誤的地方:

try
{
    await GetBlogsFromApi();
}
catch (HttpRequestException e)
{
    throw e;
}

你知道當(dāng)我們重新拋出這樣的異常時會出現(xiàn)什么問題嗎?

throw e;語句中,表達(dá)式的結(jié)果e必須可隱式轉(zhuǎn)換為System.Exception

你可以使用內(nèi)置異常類,例如ArgumentOutOfRangeExceptionInvalidOperationException。.NET 還提供了在特定條件下拋出異常的輔助方法:ArgumentNullException.ThrowIfNullArgumentException.ThrowIfNullOrEmpty。你還可以定義自己的派生自System.Exception 的異常類。

異常的堆棧跟蹤被重寫到我們明確重新拋出它的代碼行,這意味著我們首先丟失了有關(guān)導(dǎo)致異常的原因的所有有價值的信息,這會使調(diào)試代碼變得非常困難。

但是,我們可以很容易地解決這個問題。

catch塊內(nèi),你可以使用throw;語句重新拋出塊處理的異常catch

try
{
    await GetBlogsFromApi();
}
catch (HttpRequestException e)
{
    throw;
}

當(dāng)我們這樣做時,異常會在保留原始堆棧跟蹤的同時重新拋出,我們現(xiàn)在首先保存有關(guān)導(dǎo)致異常的原因的所有有價值的信息,我們調(diào)試代碼并找出問題所在會容易得多。

注意
throw;保留異常的原始堆棧跟蹤,它存儲在Exception.StackTrace屬性中,與此相反,throw e;更新 的StackTrace屬性e。 

拋出異常時,公共語言運行庫 (CLR) 會查找可以處理此異常的catch塊。如果當(dāng)前執(zhí)行的方法不包含這樣的catch塊,CLR 會查看調(diào)用當(dāng)前方法的方法,依此類推調(diào)用堆棧。如果沒有catch找到塊,CLR 將終止正在執(zhí)行的線程。

相關(guān)文章

標(biāo)簽: asp.net  CSharp  拋出異常  throw  代碼性能  優(yōu)化  
x
  • 站長推薦
/* 左側(cè)顯示文章內(nèi)容目錄 */