2011-01-26 3 views
2

Если в catch-catch try-catch выбрано исключение, тогда будет вызван окончательный блок?Попробуйте поймать окончательный поток выполнения

try 
{ 
//some thing which throws error 
} 
catch 
{ 
//again some thing throws error 
} 
finally 
{ 
//final clean up 
} 

Здесь, наконец, будет называться?

Спасибо, Ashwani

+0

Какой язык ?, на всякий случай ... – pascal

+5

Может ты просто не сколотить небольшое тестовое приложение на языке и найти вне..? – Sean

ответ

0

В каждом языке я знаю: Да.

4

В по крайней мере Java и C# блок finally всегда выполняется независимо от того, как выйдет блок try.

Если ответ был ложным, конструкция finally не обеспечивала бы преимущества перед простое, включая код в конце блока try.

1

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

Если есть исключение в try блоке, то управление будет передано в блок catch, чтобы соответствовать сгенерированного исключение, а затем переключится на элемент управления к блоку finally.

Но в этом случае, если в блоке try не было никаких исключений, элемент управления не будет передан в блок catch, поскольку не было никаких исключений из catch.
Но, как я сказал ранее, блок finally снова обязан выполнить.

Итак, наконец, наконец, блок всегда будет выполнена

0

Нет, если есть исключение в обоих попытаться поймать блоков, как в вашем примере выше, управление не переходит окончательно блок. Иллюстрация:

try 
{ 
    //exception -> control goes to catch block. 
} 
catch 
{ 
    //again exception -> exits showing error 
} 
finally 
{ 
    //control does not reach here 
} 

ПРИМЕЧАНИЕ: Если же это выше код обернут внутри некоторой функции и есть правильная обработка т.е. попытаться исключение ... поймать блок в вызова функцию, а затем, наконец, блок действительно становится выполнен и управление перемещается от улова выше до улова вызывающей функции. Иллюстрация:

try 
{ 
    //exception -> goes to catch block. 
} 
catch 
{ 
    //again exception -> goes to finally block 
} 
finally 
{ 
    //code here is executed -> goes to calling function's catch block 
} 
1

Ответ да. Но что происходит после блок finally? Для иллюстрации полной семантики потока, необходимо учитывать следующее:

private int TryCatchFinallyFlow() 
{ 
    int i, j = 0; // set j to non-zero 

    try 
    { 
     i = 1/j; 
     goto lSkip; // comment out; 

     return i; // comment out 

     lSkip:; 
    } 
    catch (Exception) 
    { 
     i = 2; 

     throw; // comment out 
    } 
    finally 
    { 
     i = 3; 
    } 

    i = 4; 

    return i; 
} 

private void button1_Click(object sender, EventArgs e) 
{ 
    int i; 

    try 
    { 
     i = TryCatchFinallyFlow(); 
    } 
    catch (Exception) 
    { 
     i = -1; 
    } 

    MessageBox.Show(i.ToString()); 
} 

}

Вы можете экспериментировать с J = 0 или не равен нулю, и с комментированием три «закомментировать» линии. Перейдите в режим отладки.

Это покажет вам, как работают потоки.

1

Да, наконец, блок будет выполнен, если в блоке catch также есть исключение.

Это код тестирования с отладчиками.

Код

public class Demo{ 
    public static void main(String args[]){ 
     int i,j,ans; 


     try{ 
      System.out.println("Debug statement 1"); 
      i = 9; 
      ans = i/0; 
      System.out.println("Debug statement 2"); 
     } 
     catch(Exception e){ 
      System.out.println("Debug statement 3"); 
      j=5; 
      ans = j/0; 
      System.out.println("Debug statement 4"); 
     } 
     finally{ 
      System.out.println("Finally Executed"); 
     } 
    } 
} 

Выход

Debug statement 1 
Debug statement 3 
Finally Executed 
Exception in thread "main" java.lang.ArithmeticException:/by zero 
     at Demo.main(Demo.java:15) 
Смежные вопросы