Обработка исключений try catch inside catch

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

Пожалуйста, простите мою неспособность вставить реальный код, но то, что он сделал, было примерно таким:

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

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

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

37
задан Alec 13 June 2018 в 16:54
поделиться

3 ответа

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

void TrySomething() {
   try {


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

void HandleTrySomethingFailure() {
    try {

    } catch (IndexOutOfRangeException) {

    }
}

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

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

-Oisin

145
ответ дан 27 November 2019 в 03:58
поделиться

Вот пример :

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
ответ дан 27 November 2019 в 03:58
поделиться

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

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

19
ответ дан 27 November 2019 в 03:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: