Как бы я узнал, если бы не обработал некоторые непроверенные исключения, которые может выдать мой код .NET? - PullRequest
7 голосов
/ 05 февраля 2010

В .NET сигнатуры методов не сообщают мне, если я пропустил обработку некоторых исключений, которые могут генерироваться моим кодом. Есть ли какой-нибудь инструмент, который может предупредить меня, если, скажем, я использую удаление HashTable, но не обработал ArgumentNullException? Я не хочу удивляться во время выполнения.

И означает ли это, что вам нужно очень хорошо знать свой код, иначе с непроверенными исключениями будет сложнее работать?

Ответы [ 4 ]

4 голосов
/ 05 февраля 2010

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

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

2 голосов
/ 05 февраля 2010

Для приложений Windows:

AppDomain currentDomain = default(AppDomain);
currentDomain = AppDomain.CurrentDomain;
// Handler for unhandled exceptions.
currentDomain.UnhandledException += UnhandledExceptionHandler;
// Handler for exceptions in threads behind forms.
Application.ThreadException += ThreadExceptionHandler;

public static void UnhandledExceptionHandler(object sender, UnhandledExceptionEventArgs e)
{
}

public static void ThreadExceptionHandler(object sender, Threading.ThreadExceptionEventArgs e)
{
}
1 голос
/ 05 февраля 2010

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

Также старайтесь не отлавливать исключения, а устранять причину. (т.е. не поймать ArgumentNullException, но не пройти null

1 голос
/ 05 февраля 2010

Языковая поддержка того, что вы пытаетесь выполнить, отсутствует. Мы написали таможенный плагин для VS, чтобы убедиться, что все точки входа для нашего API имеют ловушки для регистрации. Однако я никогда не видел значения в языках, которое заставляло бы вас покрывать все возможные объявленные случаи исключений, поскольку вам все еще нужно написать некоторый код, чтобы сделать что-то значимое с ошибкой. Большинство людей просто смотрят на то, на что жалуется компилятор, пишут обработчик и прячут то, что может быть полезной ошибкой в ​​каком-то бесполезном коде. В некоторых случаях лучше потерпеть неудачу и знать, что есть проблема.

...