這兩個catch塊是否會被擊中?這個異常處理代碼是否有效
try
{
DoSomething();
}
catch (AuthenticationException e)
{
throw;
}
catch (Exception e)
{
throw new AuthenticationException("Hello ");
}
這兩個catch塊是否會被擊中?這個異常處理代碼是否有效
try
{
DoSomething();
}
catch (AuthenticationException e)
{
throw;
}
catch (Exception e)
{
throw new AuthenticationException("Hello ");
}
它是有效的(因爲它會編譯,構建和運行),但它不是好的做法。
僅捕捉一般異常以重新拋出特定異常將導致問題。如果沒有其他的東西在銷燬原始的異常調用堆棧。
爲了響應您的編輯,兩個catch塊都不會被擊中。
如果AuthenticationException
被啓動,第一個塊將被執行,對於任何其他異常,第二個塊將被執行。
我還想補充一點,如果你所做的一切都立即拋出,你甚至不應該發現異常。除非你真的以某種方式處理異常,否則不要抓住它。無論如何,任何其他的東西都可以抓住它,因爲無論如何。 – David 2010-09-07 15:17:58
@David:但記錄重擲可能是一個好習慣。假設代碼是人造的。 – 2010-09-07 15:40:47
@亨克:我同意問題中的代碼可能只是爲了舉例。只是認爲,爲後代的整體答案增加是很好的。儘管如此,人們應該權衡它的必要性。我最近與同事辯論過,他堅持認爲應該立即抓住它,這樣你就擁有了需要登錄的所有東西,並且我認爲這隻在捕獲默認異常(理想情況下很少)時纔有效。特定和自定義(域)例外應該將這些信息攜帶到堆棧中。 – David 2010-09-07 15:47:04
是的如果您有不同種類的例外。 (2例外)
否如果您希望第一個塊將在第二塊到達。 (1例外)
否兩個catch塊都不會被擊中。
如果DoSomething引發一個AuthenticationException,那麼它將被捕獲並重新拋出。
如果DoSomething拋出其他異常,則會引發一個新的AuthenticationException異常,並顯示消息「Hello」。
只會遇到一個異常塊。並且它們按順序排列,因此如果DoSomething()
引發AuthenticationException,則第一個catch塊將運行。
也就是說,如果您所做的只是重新拋出異常,我可能根本不會使用try/catches。這不是一個好習慣。最起碼,要確保你在你的第二個catch添加原始異常爲你創建的AuthenticationException的的InnerException:
catch(Exception e)
{
throw new AuthenticationException(e.Message, e);
}
如果DoSomething的()拋出的AuthenticationException然後
catch (AuthenticationException e)
會使用。對於所有其他類型的例外,
catch (Exception e)
但是,你不應該在第二個catch中拋出一個新的AuthenticationException。
如果DoSomething拋出任何東西,此代碼將拋出AutheniticationException。如果DoSomething拋出AuthenticationException,或者在其他情況下出現新的異常,它將會是同樣的異常。
旁註 - 它不是真正的好做法:
第二個塊不會從第一個塊中捕獲重新生成的異常。
我可以看到捕捉和重新拋出異常的一個好處是傳達這樣的信息:「請求的操作沒有成功,但系統狀態本質上與操作嘗試之前一樣」。雖然捕捉內部例程中的所有異常,並希望它們中沒有一個代表應該導致主程序終止的問題,但是我不確定什麼替代設計更好。可以用下面的代碼來代碼:
If Not Integer.TryParse(inputString, inputVar) Then Throw New MyApp.FileLoadException("Whatever") EndIf
但是,使用Integer.Parse並捕獲發生的任何異常確實看起來更自然。在已知其預期原因的小範圍內捕捉並重新設定一般例外要比在較高級別吞下一般例外要少得多。
你爲什麼不測試它並親自看看? – TrueWill 2010-09-07 15:19:11