集中调试的更好方法.c#中的断言和抛出异常

本文关键字:断言 抛出异常 方法 调试 更好 集中 | 更新日期: 2023-09-27 18:14:16

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

Debug.Assert(x != null, "x should not be null");
if (x == null)
{
    throw new ArgumentNullException("x");
}

无处不在,我将简单地创建一个带有静态方法的静态类来集中它。

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

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

谢谢!

集中调试的更好方法.c#中的断言和抛出异常

另一种方法是Microsoft Research的DataContracts

如果无论如何都要显式抛出异常,那么断言x != null就没有什么意义了。你会在调试中看到异常,除非你有一些全局异常处理——即使这样,你也可以在所有异常上中断,而不是仅仅不被捕获。

使用assert的时间将是如果你认为最安全的发布模式代码路径是做一些事情而不是抛出异常,例如从函数中提前返回,将变量初始化为默认值等。

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

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

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

如果你喜欢流畅的扩展,还有另一种方法。

x.MustNotBeNull();

以Sharp-architecture

中的契约式设计为例

您可能还想看看这里描述的企业库异常处理块。它的特性之一是集中异常处理。如果不出意外的话,它是开源的,因此您可以将其用作自己实现的模式。