Многократная пробная ловля или одна? - PullRequest
57 голосов
/ 13 июля 2010

Обычно я бы сделал это:

try
{
    code

    code that might throw an anticipated exception you want to handle

    code

    code that might throw an anticipated exception you want to handle

    code
}
catch 
{

}

Есть ли какая-то польза от этого?

code

try
{
    code that might throw an anticipated exception you want to handle
}
catch
{
}

code

try
{
    code that might throw an anticipated exception you want to handle
}
catch
{
}

code

Обновление:

Первоначально я задавал этот вопрос со ссылкой на C #, но, как прокомментировал А. Леви, он может применяться к любому языку обработки исключений, поэтому я заставил теги отражать это.

Ответы [ 11 ]

69 голосов
/ 13 июля 2010

Это зависит.Если вы хотите обеспечить специальную обработку для определенных ошибок, тогда используйте несколько блоков catch:

try
{ 
    // code that throws an exception
    // this line won't execute
}
catch (StackOverflowException ex)
{
    // special handling for StackOverflowException 
}
catch (Exception ex)
{
   // all others
}

Если, однако, вы хотите обработать исключение и продолжить выполнение, поместите код в отдельные блоки try-catch:

try
{ 
    // code that throws an exception

}
catch (Exception ex)
{
   // handle
}

try
{ 
    // this code will execute unless the previous catch block 
    // throws an exception (re-throw or new exception) 
}
catch (Exception ex)
{
   // handle
}
13 голосов
/ 13 июля 2010

Если бы я мог выбрать второе, я бы, вероятно, разделил это на две функции.

11 голосов
/ 13 июля 2010

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

6 голосов
/ 13 июля 2010

Вы думаете об этом неправильно. Что вам нужно делать в ваших блоках улова? Если вы восстановите из любое из возможных исключений, запустив один и тот же код, независимо от того, какая операция вызвала исключение, используйте один блок catch. Если вам нужно выполнить различные операции очистки в зависимости от того, какую операцию выкинуло, используйте несколько блоков захвата.

Кроме того, если вы можете использовать try / finally или шаблон RAII вместо try / catch, тогда вам следует.

4 голосов
/ 13 июля 2010

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

Также заключать весь код в один большой блок try / catch также плохо, если у вашего приложения есть какая-то проблема, и она падает, но, поскольку вы перехватили большое общее исключение, вероятность того, что вы действительно сможете правильно его обработатьниже.У вас должны быть специальные части внутри try catch, например, если вы читаете файл или принимаете пользовательский ввод.Таким образом, вы можете лучше справиться с этим исключением

2 голосов
/ 13 июля 2010

Это зависит от характера типа ошибок, происходящих в вашем коде.

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

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

НЕ ПРИМЕНЯЙТЕ ЕДИНЫЙ МЕТОД ДЛЯ ВСЕХ СЛУЧАЙ. ПРОГРАММИРОВАНИЕ НАИБОЛЕЕ ВРЕМЕНИ КОНТЕКСТНО ОСОБЕННО:)

Вам необходимо достичь баланса «ХОРОШО / КОМПЛЕКС» и «ПЛОХО / ПРОСТО». Чем больше вы будете кодировать, тем меньше будет дилемма такого рода :)

Счастливого программирования!

2 голосов
/ 13 июля 2010

Я бы выбрал второй вариант, но всякий раз, когда я вижу этот кодовый шаблон, мое первое чувство состоит в том, чтобы разделить его на несколько функций / методов. Очевидно, что делать это зависит от того, что делает код;)

2 голосов
/ 13 июля 2010

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

1 голос
/ 26 марта 2018

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

try{
   try{
      ... send message
   }
   catch(exception e){
    ...log error
    ...rethrow  send related error/show custom error
   }
   try{
       ...try to receive response
   }
   catch(exception e){
       ...show receive related error
   }
   //finally close the connection
   }finally{
        ...close connection
   }
1 голос
/ 13 июля 2010

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

...