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

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

Мне интересно, есть ли способ выполнить блок, если не было выбрано исключение?

Лучшее, что я могу придумать, это следующее:

bool exception = false;
try{
    // something
}catch(Exception e){
    exception = true;
}finally{
    if(!exception){
        // i can do what i want here
    } 
}

Есть ли лучший способ?

4b9b3361

Ответ 1

Конечно, есть: поместите его в нижнюю часть блока try.

try{
    // something
    // i can do what i want here
}catch(Exception e){
    // handle exception
}

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

Если вы хотите вернуть прежнее поведение, вы также можете использовать этот вариант, который не требует finally только для написания условия "если нет исключений":

var checkpointReached = false;
try{
    // something
    checkpointReached = true;
    // i can do what i want here
}catch(Exception e){
    if (checkpointReached) throw; // don't handle exceptions after the checkpoint
    // handle exception
}

Ответ 2

Можете ли вы структурировать свой код, что doSomething является последним оператором в блоке, и он не бросает?

bool exception = false;
try{
  // something
  doSomething();
} catch {
}
finally {
}

Ответ 3

Вам не нужно предложение finally.

Решение:

bool exception = false;
try{
    // something
}catch(Exception e){
    exception = true;
}
if(!exception){
     // u can do what u want here
} 

Обычно у вас просто будет возврат в предложение catch, так что вам даже не нужно тестировать:

try{
    // something
}catch(Exception e){
   // do things
   return;
}
// u can do what u want here

или (в зависимости от используемого варианта и, как правило, менее ясны, особенно если вы ожидаете более одного исключения - вы не хотите иметь отпечатки try-catch...):

try{
    // something
    // u can do what u want here
}catch(Exception e){
   // do things
}

Ответ 4

Да, есть: поместите его в конец блока try:)

Ответ 5

Нет, у вас есть, вероятно, лучший способ сделать это на С#.

Предполагается, что:

  • Вы не хотите, чтобы код "Я могу сделать то, что мне нужно здесь" находится в нижней части вашего блока try. (Возможно, потому, что вы не хотите, чтобы исключения в этом коде обрабатывались основным блоком catch.)
  • Вы не хотите, чтобы код "Я могу сделать то, что мне нужно здесь" полностью запущен за пределами структуры try...catch...finally. (Возможно, потому, что вы хотите, чтобы этот код запускался перед другим кодом, который находится внутри блока finally.)

Ответ 6

В коде нет ничего плохого, это не нужно. Просто введите код, который вы хотите выполнить в нижней части блока try:

try {
    ...
    // No errors to this point, run what you wanted to run in the finally.
}
catch(Exception e) {
    ...
}

Ответ 7

Я считаю, что вы ищете попробовать в своей попытке:

try{
    // something

    try{
        // something else not interfering with first try
    } catch(Exception innerEx){
        // something else threw this innerEx
    }

}catch(Exception outerEx){
    // something threw this outerEx
}

Хотя это обычно считается плохой практикой, мне больше нравится версия флага.