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

Наскоро попаднах на код, написан от колега програмист, в който той имаше оператор try-catch вътре в catch!

Моля, извинете ме за невъзможността да поставя действителния код, но това, което той направи, беше нещо подобно на това:

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

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

РЕДАКТИРАНЕ: Това, което той всъщност прави в catch, той извършва някои операции, които могат/трябва да бъдат направени, когато първоначалният опит е неуспешен. Проблемът ми е с чист код и поддръжка. Делегирането на изключението от първия catch на друга функция или извикващата функция би било ОК, но добавянето на повече код, който може или не може да хвърли изключение в първия catch, е това, което чувствах, че не е добре. Опитвам се да избягвам множество подредени изрази "if-loop", намерих това също толкова лошо.


person topgun_ivard    schedule 19.08.2010    source източник
comment
Това е доста често срещано, така че без да виждате какво всъщност прави кодът - няма нищо лошо в това.   -  person nos    schedule 20.08.2010
comment
По-скоро бих го попитал какво се опитва да постигне.   -  person Martin York    schedule 20.08.2010


Отговори (3)


Защо това е лошо? Концептуално не се различава от:

void TrySomething() {
   try {


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

void HandleTrySomethingFailure() {
    try {

    } catch (IndexOutOfRangeException) {

    }
}

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

Още по-ироничното е, че когато трептенето вгради този код, той ще изглежда точно като вашия пример.

-Ойсин

person x0n    schedule 19.08.2010
comment
Напълно съм съгласен. Ако смятате, че нещо не е наред с неговия код и сте готови да се изправите срещу него за това, по-добре разполагайте с отлична алтернатива, готова за представяне. - person ChrisNel52; 20.08.2010
comment
да Разделянето на вложената try-catch в собствен метод е най-доброто, което може да се направи. - person Sava B.; 22.03.2018

Ето един случай:

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

person Colin Hebert    schedule 19.08.2010
comment
Има ли по-чист начин за справяне с това. - person Arpit Agrawal; 29.06.2018
comment
@ArpitAgrawal Използвайте фантастичен пакет за управление на изключения/опит/повторен опит като Polly. - person x0n; 26.06.2019

Без да знаем какво прави кодът, е невъзможно да се каже. Но не е необичайно да правите това.

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

person Brian Agnew    schedule 19.08.2010