2009-07-28 148 views
1

我有以下代碼:異常處理問題

  try { 
       fi.MoveTo(getHistoryFileName()); 
      } finally { 
       Debug.Write("Move complete"); 
      } 

我認爲用這個將確保我從來沒有拋出的異常,但我有時得到的IOExceptions。是什麼原因?

回答

7

終於不會拋出異常;它保證它中的代碼將被執行,而不管在try塊中是否拋出異常。

你會想要捕捉異常,然後適當地處理它們。 Catch塊將是嘗試和finally塊之間,並與像這樣開始:

catch(Exception ex) 
{ 
    //error handling 
} 

你可以用更具體的異常更換例外,只是處理該異常。

3

這意味着finally塊將始終得到執行,即使例外。

您仍然需要在finally之前的catch (IOException)塊來處理您不想傳播的異常。

try { 
    fi.MoveTo(getHistoryFileName()); 
} catch (Exception) { 
    // eat exceptions. 
} finally { 
    Debug.Write("Move complete"); 
} 
4

try/finally組合不會處理像您認爲的異常。

它所做的只是儘可能地確保finally代碼塊中的代碼將運行,即使在try代碼塊中的代碼中引發異常時也是如此。

爲了避免特定的異常,處理它們,就像這樣:

try { 
    fi.MoveTo(getHistoryFileName()); 
} catch (IOException ex) { 
    // swallow this one 
} finally { 
    Debug.Write("Move complete"); 
} 
+3

請注意「// swalow this one」的註釋,當捕捉到一個異常並對其無所作爲時,總是一個好主意,在那裏發表某種意見,表明你是故意這樣做的,所以你或別人知道它是從現在開始的6個月或一年的明智決定。 – 2009-07-28 18:40:00

2

你沒有catch條款,所以沒有異常被逮住。

finally子句沒有吞下異常,只是在異常被引發到調用函數之前被執行。

這和吞嚥異常是一個壞主意。你不應該吞下例外,而應該適當和適度地處理它們。至少他們應該被記錄用於調試目的。

1

重寫爲:

try { 
    fi.MoveTo(getHistoryFileName()); 
} catch (Exception ex) { 
    // do something about it. 
} finally { 
Debug.Write("Move complete"); 
} 
1

您使用catch捕捉到任何異常。最後只是確保即使拋出異常,其內容也會執行。 (即使出現問題,也可以清理乾淨)。

1

你的接觸在哪裏?

try { 
fi.MoveTo(getHistoryFileName()); 
} 
catch (IOException ex) { 
//log it and take apporpriate action 
} finally { 
Debug.Write("Move complete"); 
} 
2

正如其他人所說,如果你想停止未處理的異常冒泡,你需要一個catch塊。但是我很困惑你的問題。你的措辭是這樣的:

從來沒有拋出

這是微妙的錯誤例外。你永遠不能停止拋出異常。你所能做的就是處理它,所以它不會給用戶。我甚至可能會放棄這一點,因爲很難用語義來形容它。但是,你也可以在你的finally塊中有「Move complete」行。把它們放在一起,這讓我懷疑你是否認爲通過捕捉異常你可以強制你的try代碼塊成功。這只是危險的。不要只是吞下異常,然後向用戶報告一切如預期。