Лучший способ централизовать Debug.Assert и выбросить исключение в C #? - PullRequest
3 голосов
/ 11 ноября 2011

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

Debug.Assert(x != null, "x should not be null");

if (x == null)
{
    throw new ArgumentNullException("x");
}

везде, я бы просто создал статический класс со статическим методом для его централизации.

Однако у этого есть своя собственная проблема, которая заключается в том, что если Debug.Assert запускается, тогда VS будет всплывать в статическом методе вместо того, где должен быть вызывающий метод, где он и должен быть.

Просто любопытно, если у кого-то есть лучший способ справиться с этим сценарием или вообще, как справиться с этой повторяющейся работой?

Спасибо!

Ответы [ 5 ]

2 голосов
/ 11 ноября 2011

Другим подходом являются DataContracts от Microsoft Research.

1 голос
/ 11 ноября 2011

Один подход помещает все в код, кроме имени переменной, чтобы минимизировать количество литерального содержимого в источнике:

Guard.Check(EGuards.NotNull, "x");

Другой подход, если вы свободно владеете расширениями (мне нравится это).

x.MustNotBeNull();
1 голос
/ 11 ноября 2011

Очень мало смысла утверждать x! = Null, если вы все равно собираетесь явно генерировать исключение.Вы увидите исключение в отладке, если у вас нет глобальной обработки исключений - и даже в этом случае вы можете разбить все исключения, а не просто неосчитанные.

Время использования assert будет, если вы решите самый безопасный выпуск-mode code-path - это сделать что-то иное, чем выдать исключение, например, чтобы досрочно вернуться из вашей функции, инициализировать вашу переменную значением по умолчанию и т. д.

Не исключать утилиты, упомянутые в других ответах, ноВы, вероятно, хотите в каждом конкретном случае тщательно продумать, уместно ли выбрасывать исключение или утверждать (и это относится не только к проверке аргумента).

0 голосов
/ 11 ноября 2011

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

0 голосов
/ 11 ноября 2011

посмотрите на Design By Contract например в Sharp-архитектура

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...