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

Использование catch без аргументов

В чем разница между:

catch
{
    MessageBox.Show("Error.");
}

и

catch (Exception ex)
{
    MessageBox.Show("Error.");
    //we never use ex, so is it better to use catch without arguments?
}
4b9b3361

Ответ 1

Как и для .NET 2, если вы не настраиваете конфигурацию? Ничего.

До этого или с некоторыми настройками конфигурации я точно не помню, была возможность исключения из неуправляемого кода, который не преобразовывался в объект Exception -compatible.

Обратите внимание, что между ними существует другая опция, в которой вы указываете тип, но не переменную:

catch (Exception)
{
   ...
}

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

Ответ 2

Как правило, сначала вы должны поймать определенные ошибки.

Но если вы поймаете общий Exception, как вы, я бы сказал, используйте второй случай:

catch (Exception ex)
{
     MessageBox.Show("Error.");
     //we never use ex, so is it better to use catch without arguments?
}

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

Будьте очень осторожны, используя этот подход:

MessageBox.Show("Error.");

Не отслеживать ваши ошибки где-нибудь (например, файл журнала) может вызвать по-настоящему большой беспорядок.

Ответ 3

Я думаю, что они одинаковы. Но второй случай поднял предупреждение о компиляторе, потому что вы объявляете исключение, которое вы не использовали. Мне нравится первый, потому что вы явно говорите, что вы не используете исключение. Существует также третий

catch (Exception)
{
    //do something
}

если вы хотите указать тип исключения, но не заботятся о самом исключении.

Ответ 4

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

Ответ 5

Некоторое исключение не может быть catch(Exception) уловлено.

Ниже excecption в mono on linux, должен улавливать без параметра.

В противном случае время выполнения игнорирует статус catch(Exception).

System.Reflection.ReflectionTypeLoadException: The classes in the module cannot be loaded.

Если вы столкнулись с такой проблемой, попробуйте удалить параметр оператора catch, запишите контекстные vars, чтобы узнать причину ошибки.

P.S. Я не знаю, как в окнах программа работает в окнах в обычном режиме.