Не бросайте какие-либо особые типы исключений в код, который вы просматриваете.Вызовите Trace.Assert
, или, в этом случае, даже Trace.Fail
, чтобы получить эффект, аналогичный Debug.Assert
, за исключением включения даже в сборках выпуска (при условии, что настройки не изменились).
Если прослушиватель трассировки по умолчанию, тот, который предлагает пользовательский интерфейс, который предлагает убить всю программу или запустить отладчик, не подходит для ваших нужд, настройте настраиваемый прослушиватель трассировки в Trace.Listeners
, который вызывает частный тип исключения при каждом вызове Trace.Fail
(в том числе при сбое Trace.Assert
).
Тип исключения должен быть закрытым типом исключения, поскольку в противном случае вызывающие абоненты могутиспытайте искушение попытаться поймать тот тип исключения, который вы собираетесь сгенерировать.Для этого конкретного типа исключения вы захотите сделать как можно более ясным, что будущая версия метода больше не будет генерировать это конкретное исключение.Вы не хотите, чтобы вас заставляли выбрасывать TraceFailedException
или как вы его называете с этого момента до вечности, чтобы сохранить обратную совместимость.
В другом ответе упоминается кодекс контрактов, уже в качестве альтернативы.Это аналогичным образом: вы можете позвонить Contract.Assert(false)
.При этом используется тот же подход: настраивается то, что происходит в случае сбоя утверждения, но в этом случае поведение по умолчанию - генерировать исключение, опять же, типа, который не доступен извне.Однако, чтобы максимально использовать контракты кода, вы должны использовать статический переписчик, который имеет как плюсы, так и минусы, которые я не буду здесь рассматривать.Если для вас плюсы перевешивают минусы, то непременно воспользуйтесь им.Однако если вы предпочитаете избегать статического переписывания, я бы рекомендовал полностью исключить класс Contract
, поскольку совершенно не очевидно, какие методы работают и не работают.