2010-08-19 111 views
24

我最近遇到了一個由程序員編寫的代碼,他在catch中有一個try catch語句!異常處理try catch catch catch

請原諒我不能粘貼實際的代碼,但他的所作所爲是類似的東西這個

try 
{ 
//ABC Operation 
} 
catch (ArgumentException ae) 
{ 
    try 
    { 
     //XYZ Operation 
    } 
    catch (IndexOutOfRangeException ioe) 
    { 
     //Something 
    } 
} 

我個人覺得這是我所見過的最窮的代碼之一! 在1到10的範圍內......你覺得我應該多快,並給他一個我的想法? 還是我過度反應?

編輯: 他實際上在做什麼是在捕捉,他正在執行一些其他操作,可以/應該在初次嘗試失敗時完成。我的問題是有一個乾淨的代碼和可維護性。將第一個catch的異常委託給不同的函數或調用函數是可以的,但是添加更多的代碼可能會或可能不會將異常拋入第一個catch,這是我感覺不好的。我儘量避免多個堆疊的「if-loop」語句,我發現這同樣很糟糕。

  • IvarD
+8

這是很常見的,所以沒有看到代碼實際上做了什麼 - 這沒有什麼本質上的錯誤。 – nos 2010-08-19 21:05:09

+5

我寧願問他他試圖達到什麼目的。 – 2010-08-19 21:12:46

回答

107

爲什麼那麼糟糕?這是沒有什麼不同概念比:

void TrySomething() { 
    try { 


    } catch (ArgumentException) { 
     HandleTrySomethingFailure(); 
    } 
} 

void HandleTrySomethingFailure() { 
    try { 

    } catch (IndexOutOfRangeException) { 

    } 
} 

你去那邊之前,給他一塊你的大腦(試頂葉,這是特別反感),正是你要對他說?你怎麼回答這個諺語「爲什麼?」

更具諷刺意味的是,當抖動嵌入此代碼時,它看起來與您的示例完全相同。

-Oisin

+16

我完全同意。如果你覺得他的代碼有問題,並且願意與他對話,那麼你最好有一個很好的替代方案來呈現。 – ChrisNel52 2010-08-19 21:07:07

11

不知道的代碼做的事情很難說。但它不是不尋常的要做到這一點。

例如如果您在處理異常時必須清理資源,那麼該清除代碼本身可能會引發異常。

17

這裏有一個案例:

try{ 
    //Dangerous Operation 
} catch (AnyException ae) { 
    try { 
     //Do rollback which can fail 
    } catch (RollbackFailedException rfe) { 
     //Log that 
    } 
} finally { 
    try { 
     //close connection but it may fail too 
    } catch (IOException ioe) { 
     //Log that 
    } 
} 

這是關於同樣的事情@ x0n說。嘗試關閉資源時或在嘗試解決由另一個異常引起的情況時,您可能需要處理異常。