Подтвердить что ты не робот

Несколько попыток или один?

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

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

Update:

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

4b9b3361

Ответ 1

Это зависит. Если вы хотите обеспечить специальную обработку для определенных ошибок, используйте несколько блоков 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
}

Ответ 2

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

Ответ 3

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

Ответ 4

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

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

Ответ 5

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

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

Ответ 6

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

Ответ 7

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

Ответ 8

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

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

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

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

Вам нужно достичь баланса "GOOD/COMPLEX" и "BAD/SIMPLE". Чем больше вы кодируете, тем меньше вы будете сталкиваться с такой дилеммой:)

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

Ответ 9

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

Ответ 10

Второй способ, но в идеале использовать защитные коды кода - попытка/улов дорогостоящий