相关疑难解决方法(0)

什么时候断言应该留在生产代码中?

有一个讨论,在comp.lang.c超过回事++.关于缓和与否的断言,这在C++中默认情况下只在调试中存在的构建,应保持在生产代码或没有.

显然,每个项目都是独特的,所以在这里我的问题是没有这么多是否断言应该保持,但在这情况下,这是值得推荐的/不是一个好主意.

通过断言,我的意思是:

  • 一个运行时检查,用于测试一个条件,当该条件为false时,会显示软件中的错误.
  • 程序停止的机制(可能是在最小的清理工作之后).

我不一定在谈论C或C++.

我自己的观点是,如果你是程序员,但不拥有数据(大多数商业桌面应用程序就是这种情况),你应该保持它们,因为失败的断言显示了一个错误,你不应该去有bug,有可能破坏用户的数据.这会强制您在发货前进行强力测试,并使错误更加明显,从而更容易发现并修复.

你有什么看法/经验?

干杯,

卡尔

在此查看相关问题


回应和更新

嘿格雷厄姆,

断言是错误的,纯粹而简单,因此应该像一个一样处理.由于应该在发布模式下处理错误,因此您不需要断言.

这就是为什么我在谈论断言时更喜欢"bug"这个词.它使事情更加清晰.对我来说,"错误"这个词太模糊了.丢失的文件是错误,而不是错误,程序应该处理它.试图取消引用空指针是一个错误,程序应该承认有些东西闻起来像坏奶酪.

因此,您应该使用断言来测试指针,但是存在具有正常错误处理代码的文件.


稍微偏离主题,但讨论中的一个重点.

作为一个单挑,如果你的断言在失败时闯入调试器,为什么不呢.但是有很多原因导致文件不存在,完全不受代码控制:读/写权限,磁盘已满,USB设备已拔下等等.由于您无法控制它,我觉得断言是不是处理这个问题的正确方法.

卡尔


托马斯,

是的,我有代码完成,并且必须说我非常不同意该特定建议.

假设您的自定义内存分配器搞砸了,并将一些仍然被其他对象使用的内存归零.我碰巧将这个对象定期解除引用的指针归零,并且其中一个不变量是该指针永远不为空,并且你有几个断言以确保它保持这种状态.如果指针突然为空,你会怎么做?你只是if()围绕它,希望它有效吗?

请记住,我们在这里讨论产品代码,因此不会破坏调试器并检查本地状态.这是用户机器上的一个真正的错误.

卡尔

assert

160
推荐指数
7
解决办法
5万
查看次数

C# - Assert()方法有什么作用?它还有用吗?

我正在调试断点,我意识到断言调用?我以为它只适用于单元测试.它比断点更有用吗?既然我可以断点,我为什么要使用断言?

c# assert

151
推荐指数
8
解决办法
15万
查看次数

Debug.Assert与Code Contract的使用

我什么时候应该调试代码合同上的问题,反之亦然?我想检查一个方法的前提条件,我很困惑,选择一个而不是另一个.我有单元测试,我想测试故障情况并期望异常.

在同一方法上使用Debug.Assert和Code契约是一个好习惯.如果是这样,代码的编写顺序是什么?

Debug.Assert(parameter!= null);
Contract.Requires<ArgumentNullException>(parameter != null, "parameter");
Run Code Online (Sandbox Code Playgroud)

要么

Contract.Requires<ArgumentNullException>(parameter != null, "parameter");
Debug.Assert(parameter!= null);
Run Code Online (Sandbox Code Playgroud)

它背后有什么理由吗?

c# assert code-contracts

42
推荐指数
2
解决办法
8823
查看次数

在采用无效代码路径时抛出哪个异常?

我发现自己编写了一些方法,其中存在一个永远不会发生的代码路径.这是一个简化的例子:

double Foo(double x) {
    int maxInput = 100000;
    double castMaxInput = (double)maxInput;
    if (x < 0 || x > castMaxInput || double.IsNaN(x)) {
        return double.NaN;
    }
    double r = 0;
    for (double boundary = 1; boundary<=castMaxInput; boundary++) {
        if (x <= boundary) {
            r += boundary * (x + 1 - boundary);
            return r;
        }
        else {
            r += boundary;
        }
    }

    // we should never get here.
    throw new SomeException();
}
Run Code Online (Sandbox Code Playgroud)

这里最有意义的例外是类似的

TheAuthorOfThisMethodScrewedUpException() 
Run Code Online (Sandbox Code Playgroud)

因为如果我们到达for循环的末尾,那就是正在发生的事情.不幸的是,使用上面构造的方法,编译器似乎不够聪明,无法确定for循环之后的代码永远不会发生.所以你不能在那里什么也没有,或者编译器会抱怨"并非所有的代码路径都返回一个值".是的,return double.NaN除了之前我还可以在循环之后输入.但这会掩盖问题的根源.

我的问题是 …

c# exception

15
推荐指数
2
解决办法
2007
查看次数

是否值得在ASP.NET中使用Debug.Assert?

在ASP.NET中设置适当的调试环境似乎是一个相当大的麻烦,我只是想知道是否使用Asserts是否可行.我读了一下,看到你需要修改你的web.config以正确使用Asserts.这通常是最好的方法还是其他调试方法可能更容易使用?

我们不使用单元测试框架,因此与问题无关.

你怎么知道他们正常工作或根本不工作的区别?目前我可以在我的代码中输入断言,它绝对不会做任何事情,因为它们没有在web.config中配置.这对我来说似乎很危险.

asp.net debugging assert

14
推荐指数
1
解决办法
3477
查看次数

单元测试是否不需要Debug.Assert()?

我已经准备好Mcconnell的" 代码完成 " 了一段时间.现在我在亨特和托马斯的" 实用程序员 "中再次阅读:使用断言!注意:我的意思是,不是单元测试断言Debug.Assert().

在SO问题之后什么时候应该使用Debug.Assert()?当使用断言过例外领域类的断言是发展有用的,因为"不可能"的情况下,可以发现相当快.它们似乎很常用.据我理解的断言,在C#中,它们通常用于检查"不可能"值的输入变量.

为了尽可能简化和隔离单元测试,我用nulls和"不可能"的虚拟输入(如空字符串)来提供类和方法.

此类测试明确记录,它们不依赖于某些特定输入.注意:我正在练习Meszaros的"xUnit测试模式"描述为Minimal Fixture.

这就是重点:如果我有一个保护这些输入的断言,它们会炸毁我的单元测试.

我喜欢断言编​​程的想法,但另一方面我不需要强迫它.目前我想不出任何用途Debug.Assert().也许有一些我想念的东西?你有什么建议,他们真的有用吗?也许我只是高估了断言的用处?或者也许我的测试方式需要重新审视?

编辑:调试的最佳实践单元测试期间的断言非常相似,但它没有回答困扰我的问题:如果我Debug.Assert()按照我的描述进行测试,我是否应该关心C#?如果是的话,它们在哪种情况下真的有用?在我目前的观点中,这样的单元测试将Debug.Assert()没有必要.

另一点:如果你真的认为,这是一个重复的问题,只需发表一些评论.

c# unit-testing

10
推荐指数
1
解决办法
1336
查看次数

断言C#+何时使用它们

我已经看过几篇关于在C#中使用Debug.Assert的帖子.但我仍然有一个疑问,可能是它的重复,但我需要问.

有一个严格的规则,Debug.Assert应该只用于检查类的成员或用于检查公共方法的参数?

或者我可以在任何地方使用Debug.Assert,并检查任何条件?

谢谢桑迪普

c# asp.net debugging assertion

2
推荐指数
1
解决办法
127
查看次数