использование try catch - PullRequest
2 голосов
/ 21 июня 2011

Что лучше: кодовый фрагмент 1 или кодовый фрагмент 2? И почему?

/* Code Snippet 1
 * 
 * Write try-catch in function definition
 */
 void Main(string[] args)
 {
     AddMe();
 }

 void AddMe()
 {
     try
     { 
         // Do operations...
     }
     catch(Exception e)
     {
     }
 }

/* Code Snippet 2
 * 
 * Write try-catch where we call the function.
 */
 void Main(string[] args)
 {
     try
     {
         AddMe();
     }
     catch (Exception e)
     {
     }
 }

 void AddMe()
 {
     // Do operations...
 }

Ответы [ 7 ]

4 голосов
/ 21 июня 2011

Реальный вопрос, который нужно задать: «Каков контракт AddMe с остальным миром?»Если AddMe представляет собой все-все-все-все-таки интерфейс и правильно обрабатывает любое исключение, которое встречается соответствующим образом, тогда, конечно, - пусть оно его перехватит.Если AddMe не знает или не может знать, что делать с исключением, он должен выбросить и отложить обработку до вызывающего кода.

2 голосов
/ 21 июня 2011

Зависит, как обычно.

В фрагменте № 1 обработка ошибок может использоваться повторно.В Snippet # 2 это не так, но это лучше в тех случаях, когда вы хотите использовать различную обработку ошибок в разных местах.

В остальном они идентичны.

1 голос
/ 21 июня 2011

TL, DR; Поймайте исключения, когда вы можете что-то сделать с этим исключением, в противном случае позвольте им течь вверх по стеку вызовов, пока что-то еще не обработает их. Если исключение не может быть обработано какой-либо конкретной частью вашего приложения, ваш метод события ошибки приложения должен обработать все записи для вас. Ваша функциональность регистрации станет вашей конечной сетью для работы с исключениями.

Я работал с несколькими магазинами, которым требуется логика try catch для КАЖДОГО метода, и я узнал, что объект Exception лучше наблюдает за вашим стеком вызовов, чем вы.

Мое другое эмпирическое правило - уведомлять пользователя об исключениях в пользовательских событиях триггера. Таким образом, захваты на основе событий или команд были бы отличным местом для обнаружения, уведомления и повторного выброса того же исключения. (IE throw; НЕ бросать ex;)

1 голос
/ 21 июня 2011

ИМХО, разрешить методам генерировать исключения.Не пытайтесь прятаться, когда что-то идет не так.Когда они это сделают, клиент сам решает, как он будет обрабатывать исключение.Это объясняется тем, что каждое приложение может захотеть сделать что-то свое, за исключением.

1 голос
/ 21 июня 2011

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

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

Вы все еще можете попробовать / перехватить во внутренних методах, если вам нужно делать другие вещи с исключениями, но не забывайте перебрасывать их, иначе регистратор в основном методе не будет ничего регистрировать.

И помните, чтобы правильно отбросить, используйте:

throw;

а не:

throw e;

Поскольку первый сохраняет всю трассировку стека, а второй - нет.

1 голос
/ 21 июня 2011

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

0 голосов
/ 21 июня 2011

На этот вопрос уже есть хорошие ответы, в конечном счете сводящиеся к «это зависит», но я хочу добавить мысль, которая, как я считаю, сильно влияет на то, какой метод лучше для любой конкретной ситуации.

В вашемпримеры фрагментов кода, но ваши уловы catch (Exception e) {} в противоположность, скажем, catch (IOException e) или catch (NullReferenceException, или некоторому другому более узкому типу исключения.Вид (ы) исключений, которые вы ожидаете от кода в блоке try, будет иметь значение в способе обработки.Особенно, если у вас есть более одного типа для рассмотрения, как это может быть в случае, если вы обрабатываете исключения вне подпрограммы - достаточно большой блок try верхнего уровня может иметь несколько различных типов исключений для обработки и начинает запускатьриск того, что код будет запутанным.

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

...