Отладка.Утверждение приводит к завершению моего приложения

#c#

#c#

Вопрос:

Я создал библиотеку со многими служебными функциями для выполнения некоторых задач и поместил ее в собственную DLL.

Во всех методах этой библиотеки я разместил Debug.Инструкции Assert для проверки состояния приложения.

Проблема в том, что при запуске Assert (условие равно false) появляется диалоговое окно, нажатие на которое «Прервать» приводит к сбою всего приложения, использующего эту DLL.

Это ставит 2 вопроса:

  1. Можно ли этого избежать? я бы ожидал, что это вызовет исключение без выхода из приложения.

  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 для ошибки программистов. Думайте об этом как о контракте. «Если вы используете мою функцию, никогда не используйте нулевой указатель». Таким образом, если это когда-либо произойдет, это приведет к сбою в ближайшее время (это хорошо) и во время отладки (что еще лучше). Исключения обычно бывают для исключительных ситуаций, которые могут произойти. Обычно вы хотите восстановиться после исключения, в то время как утверждение является ошибкой программирования, и вы хотите исправить их как можно скорее.