2015-07-02 5 views
-4

Я пишу некоторые рекомендации по обработке исключений, основанные на нескольких источниках в Интернете. С веб-страницы Microsoft (https://msdn.microsoft.com/en-us/library/seyhszts(v=vs.110).aspx) я получил рекомендацию:Где лучше всего разместить бросок в коде

«Трассировка стека начинается с инструкции, в которой исключение генерируется и заканчивается в выводе catch, который ловит исключение. Помните об этом, когда решаете, где разместить выступление ».

Я не очень понимаю, что это значит. Можем ли мы сказать, что лучшее место для «броска» как можно ближе к рассматриваемому вызову? Это правильно или у кого-нибудь есть другие предложения?

Редактировать: Я буду более точным. Смотрите следующий псевдокод ниже

// do something that assignes a value to 'someValue' 

    // do more that's not related to the call above 

    if (someValue == whatever) 
    { 
     throw new MyException(); 
    } 

я предполагаю, когда я бросал исключение после того, как делать что-то еще после вызова в вопросе (сделать что-то), я не буду получать правильный след стека указывает мне на прямой линии , Я прав?

+4

Извинения за то, что они звучат грубо, но если вы не понимаете, что это значит, вы, вероятно, не лучше всего определяете «лучшие» практики. –

+1

Бросьте экскремент, где дальнейшая работа не применима, обычно это происходит с ошибкой. – HimBromBeere

+0

Лучшее место? Конечно, внутри блока try или любого метода, который выполняется внутри блока try. Под этим я имею в виду, где еще вы могли бы это выразить? – jmc

ответ

0

«Трассировка стека начинается с инструкции, в которой исключение выбрасывается и заканчивается в выводе catch, который ловит исключение. Помните об этом, когда решаете, где разместить инструкцию throw».

Если следующий код не обернута внутри try-catch блока, отладчик даст вам трассировки стека, где верхние точки элемента к функции DivideTwoNumbers(), так как это, где произошло исключение. Все остальные коды после этой строки: double quotient = DivideTwoNumbers(10, 0); не будут выполнены, что означает, что все остальные сделанные вами заявления о свертке будут бесполезны. Предположим, вы ожидаете исключения внутри AnotherFunction(), можете ли вы поймать исключение или включите AnotherFunction() в трассировку стека? Ответ - нет.

static void Main(string[] args) 
    { 
     try 
     { 
      double quotient = DivideTwoNumbers(10, 0); 
      AnotherFunction(); 

     } 

     catch (DivideByZeroException ex) 
     { 
      Console.WriteLine(ex.Message); 
     } 

     Console.ReadLine(); 
    } 

    static int DivideTwoNumbers(int dividend, int divisor) 
    { 
     if (divisor == 0) 
      throw new DivideByZeroException(); 
     return dividend/divisor; 
    } 
+0

спасибо, я думаю, это отвечает на мой вопрос. –

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