集中Debug.Assert并在c#中抛出异常的更好方法?

时间:2011-11-11 07:41:03

标签: c# exception assertion

我的大多数方法都检查函数中的null参数,所以我想而不是编写

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

if (x == null)
{
    throw new ArgumentNullException("x");
}
无处不在,我只想用静态方法创建一个静态类来集中它。

然而,它有自己的问题,如果Debug.Assert被触发,那么VS将在静态方法中弹出,而不是调用方法的位置,这就是它所希望的位置。

只是好奇是否有人有更好的方法来处理这种情况,或者只是一般如何处理这种重复的工作?

谢谢!

5 个答案:

答案 0 :(得分:2)

另一种方法是来自Microsoft Research的{​​{3}}。

答案 1 :(得分:1)

如果您要显式抛出异常,那么断言x!= null是非常重要的。您将在调试中看到异常,除非您有一些全局异常处理 - 即使这样,您也可以打破所有异常,而不仅仅是未捕获。

使用assert的时间是你决定最安全的释放模式代码路径除了抛出异常之外的其他事情,例如从函数中提前返回,将变量初始化为默认值等等。 / p>

不要忽略其他答案中提到的实用程序,但您可能希望在给定的情况下仔细考虑是否适当抛出异常或断言(这不仅适用于参数验证)。

答案 2 :(得分:1)

一种方法是将所有内容放在除变量名称之外的代码中,以最大限度地减少源代码中的文字内容量:

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

另一种方法,如果你进入流畅的扩展(我喜欢翻转这个)。

x.MustNotBeNull();

答案 3 :(得分:0)

查看Sharp-architecture

中的设计合同

答案 4 :(得分:0)

您可能还想查看here所述的Enterprise Library Exception Hadling Block。 其中一个功能是集中式异常处理。如果没有别的开源,那么你可以将它用作你自己实现的模式。