2017-09-25 11 views
-1

私の練習は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」を1回試してみることもできます。しかし、これらの「Sub」メソッドがデータベーストランザクションに関するデータアクセスレイヤー上で動作していた場合、つまりキャッチブロックでトランザクションをロールバックすると仮定すると、ネストされたtry/catchが役に立ちます。私は正しい? – Nii

+0

あなたの例から、正しい。あるいは、AWS、Azureなどで実行している場合は、特定のConnection例外タイプを捕捉し、再試行システムを使用して接続を確立することができます。 –

+0

次に、 'DAL'メソッド内に' try/catch'を指定します。例外が発生してトランザクションがロールバックされ、例外がスローされました。すなわち、 'catch(Exception exp){db.Rollback(); expを投げる; } '。この例外は 'MainMethod'で捕捉されます。 – mmushtaq

関連する問題