web-dev-qa-db-ja.com

例外処理はcatch内のcatchを試行します

私は最近、仲間のプログラマーによって書かれたコードに出くわしました。

実際のコードを貼り付けることはできませんが、彼がやったことは次のようなものでした。

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

個人的には、これは今まで見た中で最も貧弱なコードの一部だと感じています! 1から10のスケールで、どれくらい早く私が彼に私の心の一部を伝えて、それとも私が過剰反応していると思いますか?

編集:彼は実際にキャッチで何をしているか、彼は最初の試行が失敗したときに行うことができる/すべきいくつかの操作を実行しています。私の問題は、きれいなコードと保守性を持つことです。最初のキャッチから別の関数または呼び出し元の関数に例外を委任することは問題ありませんが、最初のキャッチに例外をスローする場合としない場合があるコードを追加することは良くないと感じました。私は複数の「if-loop」ステートメントが積み重なるのを避けようとしましたが、これも同様に悪いことがわかりました。

36
topgun_ivard

なぜそれが悪いのですか?概念的には以下と同じです:

void TrySomething() {
   try {


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

void HandleTrySomethingFailure() {
    try {

    } catch (IndexOutOfRangeException) {

    }
}

あなたがそこに行って彼にあなたの脳の一部を与える前に(頭頂葉を試してください、それは特に攻撃的です)、あなたは彼に正確に何を言うつもりですか? 「なぜ」ということわざにどう答えますか。

さらに皮肉なことに、ジッターがこのコードをインライン化すると、例のようになります。

-オイシン

138
x0n

ケースは次のとおりです。

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が言ったのとほぼ同じです。リソースを閉じようとしているとき、または別の例外によって引き起こされた状況を解決しようとしているときに、例外を処理する必要がある場合があります。

22
Colin Hebert

コードが何をするのかを知らなければ、言うことは不可能です。しかし、これは異常ではありません。

例えば例外の処理中にリソースを消去する必要がある場合、その消去コード自体に例外をスローする機能がある場合があります。

18
Brian Agnew