Обработка исключений попробуйте catch внутри catch - PullRequest
34 голосов
/ 20 августа 2010

Недавно я наткнулся на код, написанный другим программистом, в котором у него был оператор try-catch внутри catch!

Пожалуйста, прости меня за неспособность вставить настоящий код, но он сделал что-то похожее наэто:

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

Я лично чувствую, что это один из самых бедных кодов, которые я когда-либо видел!По шкале от 1 до 10, как вы думаете, как скоро я пойду и расскажу ему о своем уме, или я чрезмерно реагирую?

РЕДАКТИРОВАТЬ: Что он на самом деле делает в улове, онвыполняет некоторые операции, которые могут / должны быть выполнены, если первоначальная попытка не удалась.Моя проблема с чистым кодом и удобством обслуживания.Передача исключения из первого перехвата другой функции или вызывающей функции будет в порядке, но добавление кода, который может или не может вызвать исключение в первом перехвате, - это то, что я чувствовал нехорошо.Я стараюсь избегать многократных «if-loop» операторов, я нашел это одинаково плохим.

Ответы [ 3 ]

136 голосов
/ 20 августа 2010

Почему это плохо? Концептуально он ничем не отличается от:

void TrySomething() {
   try {


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

void HandleTrySomethingFailure() {
    try {

    } catch (IndexOutOfRangeException) {

    }
}

Прежде чем вы пойдете туда и дадите ему кусочек своего мозга (попробуйте темную долю, это особенно оскорбительно), что именно вы собираетесь ему сказать? Как вы ответите на общеизвестное «почему?»

Что еще более иронично, так это то, что когда джиттер вставляет этот код, он будет выглядеть точно так же, как ваш пример.

-Oisin

21 голосов
/ 20 августа 2010

Вот случай:

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. Вам может потребоваться обработать исключение при попытке закрыть ресурсы или при попытке разрешить ситуацию, вызванную другим исключением.

17 голосов
/ 20 августа 2010

Не зная, что делает код, невозможно сказать. Но это не необычно , чтобы сделать это.

например. если вам приходится очищать ресурсы при обработке исключений, сам код очистки может иметь возможность генерировать исключения.

...