2014-03-11 5 views
2

Я читал об исключениях за последние пару часов и имею базовое понимание. Однако книга, которую я читаю, не имеет лучших примеров, когда речь идет о демонстрации аспектов кодирования. Я знаю, что если у меня есть код, который может сбой, я оберну его в блок try и поймаю исключения, в частности, FormatException и т. Д.Обработка исключений Try Catch block

Однако запутанная часть заключается в том, когда дело доходит до стека вызовов, например, для вызова метода A Метод B и метод B вызывает метод C и т. д.

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

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

Любые базовые примеры были бы замечательными.

ответ

0

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

Вторые один correct.For пример в методе B если исключение брошено и не обрабатывается, он идет к методу вызывающего абонента, например A, и если A ручки, что программа исключения продолжит выполнение с этим методом. Рассмотрим следующий пример:

private static void Main(string[] args) 
{ 
    A(); 
} 

static void A() 
{ 
    try 
    { 
     B(); 
    } 
    catch (Exception ex) 
    { 
      Console.WriteLine("Exception is thrown by {0} method and handled in A method.",ex.TargetSite); 
    } 

    Console.WriteLine("We are still in A method..."); 

} 

static void B() 
{ 
    throw new Exception(); 
    Console.WriteLine("We can't see this..."); 
} 

Это будет производить вывод:

// Exception is thrown by B() method and handled in A method. 
// We are still in A method... 
1

Я не буду повторять то, что другие ответы ALRE Ади сказал, но еще одна вещь, чтобы отметить, что любые , наконец, блоков будут выполнены после заявление catch, но до исключение перебрасывается вниз по стеку. Другими словами, , наконец, блоки выполнены из верхней части стека вниз.

Например:

static void Main(string[] args) 
{ 
    try 
    { 
     Crash(); // Causes a crash 
    } 
    catch 
    { 
     Console.WriteLine("Third"); // Exception re-thrown, this runs third 
    } 
    finally 
    { 
     Console.WriteLine("Fourth"); // Run last 
    } 

    // Code will continue here when all is done 
} 

static void Crash() 
{ 
    try 
    { 
     throw new ApplicationException(); 
    } 
    catch 
    { 
     Console.WriteLine("First"); // This runs first 
     throw; // Re-throw exception 
    } 
    finally 
    { 
     Console.WriteLine("Second"); // This gets run second 
    } 

    Console.WriteLine("This will never execute.."); 
} 

Выведет Первый, затем Второй, Третий, Четвертый.

Смежные вопросы