#c#
#c#
Вопрос:
Я создал библиотеку со многими служебными функциями для выполнения некоторых задач и поместил ее в собственную DLL.
Во всех методах этой библиотеки я разместил Debug.Инструкции Assert для проверки состояния приложения.
Проблема в том, что при запуске Assert (условие равно false) появляется диалоговое окно, нажатие на которое «Прервать» приводит к сбою всего приложения, использующего эту DLL.
Это ставит 2 вопроса:
-
Можно ли этого избежать? я бы ожидал, что это вызовет исключение без выхода из приложения.
-
Почему DLL может привести к завершению работы приложения, которое ее загружает? разве это не нарушение безопасности?
Спасибо
Ответ №1:
Отладка.Assert не предназначен для завершения работы в коде выпуска (отсюда и ‘Debug’ :)). Выбор Abort означает завершение процесса, который вызвал assert. Если вы выберете Игнорировать, это должно продолжаться, и в любом случае это не должно происходить в сборке выпуска в качестве отладки.Утверждение будет удалено.
Редактировать: вот ссылка на объяснение MSDN: http://msdn.microsoft.com/en-us/library/e63efys0.aspx
Ответ №2:
Если вы хотите создать исключение, почему бы вам просто не создать исключение?
Изменить
Assert(var);
Для
if(!var)
throw new Exception("var was false");
Утверждение покинет приложение, утверждения здесь, чтобы защитить вас от ошибки программиста. Если функция никогда не должна получать нулевой указатель, и если это произойдет, то это было бы ошибкой, тогда assert был бы правильным инструментом.
Если вы хотите выразить исключительную ситуацию, то исключение — это тот инструмент, который вы ищете
Комментарии:
1. Спасибо за комментарий. Мне все еще трудно отличить, где может быть уместно исключение, а когда утверждение.
2. @liortal Как эмпирическое правило, я обычно использую assertion для ошибки программистов. Думайте об этом как о контракте. «Если вы используете мою функцию, никогда не используйте нулевой указатель». Таким образом, если это когда-либо произойдет, это приведет к сбою в ближайшее время (это хорошо) и во время отладки (что еще лучше). Исключения обычно бывают для исключительных ситуаций, которые могут произойти. Обычно вы хотите восстановиться после исключения, в то время как утверждение является ошибкой программирования, и вы хотите исправить их как можно скорее.