Несколько попыток или один?
Обычно я бы сделал это:
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:
Я изначально задал этот вопрос с ссылкой на С#, но, как заметил А. Леви, он может применяться к любому языку обработки исключений, поэтому я сделал теги отражением этого.
Ответы
Ответ 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
Второй способ, но в идеале использовать защитные коды кода - попытка/улов дорогостоящий