2017-09-25 54 views
-1

我現在的做法已經超過一年了,現在是爲每個我正在編寫的方法提供一個單獨的try/catch塊,然後在特定的代碼塊失敗時拋出異常對象。例如:我應該在每種方法上提供try/catch,還是隻提供主要方法?

void MainMethod() 
{ 
    try { 
     int num = Method1(); 
     string str = Method3(); 
     bool bln = Metho4(); 
    } catch (Exception Ex) { 
     MessageBox.Show(Ex.Message); 
    } 
} 

int Method1() { 
    try { 
     return 123 + Method2(); 
    } catch (Exception) { 
     throw; 
    } 
} 

int Method2() { 
    try { 
     return Convert.ToInt32("One Hundred"); // <-- Obviously would fail. 
    } catch (Exception) { 
     throw; 
    } 
} 

string Method3() { 
    try { 
     string str1 = "Hello "; 

     return str1 + 12345; // <-- Would also fail. 
    } catch(Exception) { 
     throw; 
    } 
} 

bool Method4() { 
    try { 
     return true; 
    } catch(Exception) { 
     throw; 
    } 
} 

我應該爲每個方法提供他們自己/單獨的try/catch塊嗎?或者,如果它的主要方法有try/catch,會更好嗎?

謝謝

+0

這取決於你想如何處理你的例外。 – SeM

+0

就你的例子而言,你只能使用'MainMethod'塊。 – SeM

+0

根據我的觀點,我會在'MainMethod()'中只使用'try/catch'。 – mmushtaq

回答

1

這真的取決於你想要完成什麼。我更喜歡在任何可能的情況下抓住並處理「根」層面的問題。

在你的情況下,我會在MainMethod中使用try/catch,如果我想捕獲並處理特定異常並且可能恢復,則在其他地方只使用try/catch

+0

我看到,按照我的例子 - 我也可以明確地決定在'MainMethod'上提供一個try/catch。但是,我在想,如果這些「Sub」方法正在專門處理數據庫事務的數據訪問層,那麼嵌套的try/catch將會受益,假設我將在Catch Block上回滾事務。我對嗎? – Nii

+0

從你的例子來看,正確。或者,如果您在AWS,Azure等運行,您可能需要捕獲特定的連接異常類型並使用重試系統建立連接 –

+0

然後在'DAL'方法內提供'try/catch',如果有發生異常,然後回滾您的事務並拋出異常。即catch(Exception exp){db.Rollback();拋出exp; ''。這個異常可以在'MainMethod'中找到。 – mmushtaq

相關問題