Подтвердить что ты не робот

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

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

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

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

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

EDIT:  То, что он на самом деле делает, заключается в том, что в уловке он выполняет некоторые другие операции, которые могут/должны выполняться при неудачной попытке первоначальной попытки. Моя проблема состоит в том, чтобы иметь чистый код и ремонтопригодность. Делегирование исключения из первого улова в другую функцию или вызывающую функцию было бы в порядке, но добавление большего количества кода, который может или не может вызывать исключение в первый улов, является тем, что я чувствовал, было не очень хорошо. Я стараюсь избегать многоуровневых операторов if-loop, я нашел это одинаково плохим.

  • IvarD
4b9b3361

Ответ 1

Почему так плохо? Это не иначе, как:

void TrySomething() {
   try {


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

void HandleTrySomethingFailure() {
    try {

    } catch (IndexOutOfRangeException) {

    }
}

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

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

-Oisin

Ответ 2

Вот пример:

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

Ответ 3

Не зная, что код не может сказать. Но это не редкость.

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