簡體   English   中英

這兩種處理異常的方式有什么區別

[英]What is the difference between these two ways of handling an exception

第一個:

for (i = 0; i < 100; i++)
{
   try { n = s.pop(); }
   catch (EmptyStackException e) { . . . }
   try { out.writeInt(n); }
   catch (IOException e) { . . . }
}

第二個:

try
{
   for (i = 0; i < 100; i++)
   {
      n = s.pop();
      out.writeInt(n);
   }
}
catch (IOException e) { . . . }
catch (EmptyStackException e) { . . . }

我知道通常我們使用第二種處理方式,但我試圖理解為什么它更好。

在第一個示例中,如果您沒有在 catch 塊中拋出另一個異常,則循環將運行所有可能的多個異常。 否則,您將退出第一個異常的循環。

第二個示例將退出第一個異常的循環。

如評論部分所述,第一個示例將運行所有迭代,即使發生異常。 第二個示例將在發生口渴異常后停止。

同樣,第一個示例可歸因於故障安全,第二個示例可歸因於快速失敗。 你並不總是喜歡一個而不是另一個,你需要看看情況。
快速失敗
故障安全

放置 try/catch 結構的位置絕對沒有性能差異。 在內部,它們作為代碼范圍表在調用方法時創建的結構中實現。 當方法正在執行時,除非發生拋出異常,否則 try/catch 結構完全不在畫面中,然后將錯誤的位置與表進行比較。

好吧,實際上只有在代碼無異常運行時才沒有性能差異。

其他答案中提到的差異,並不總是正確的 這完全取決於實現,特別是您將在 catch 塊中執行的操作。 如果你在 catch 塊中做了一些任務或者什么都不做,然后重新拋出異常,在這種情況下循環肯定會中斷。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM