Использование catch без аргументов
В чем разница между:
catch
{
MessageBox.Show("Error.");
}
и
catch (Exception ex)
{
MessageBox.Show("Error.");
//we never use ex, so is it better to use catch without arguments?
}
Ответы
Ответ 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. Я не знаю, как в окнах программа работает в окнах в обычном режиме.