|
|
1
254
在里面 Debugging Microsoft .NET 2.0 Applications
PS:如果您喜欢完整的代码,我建议您继续阅读本书。我买它是为了学习如何使用WinDBG和dump文件,但上半部分有很多技巧,可以帮助你从一开始就避免bug。 |
|
|
2
90
|
|
|
3
53
我的想法是,对于我的私有方法,我是受控制的,所以如果我开始用不正确的参数调用我自己的私有方法,那么我在某个地方打破了我自己的假设——我不应该进入那种状态。在生产中,这些私有资产在理想情况下应该是不必要的工作,因为我应该保持内部状态的有效性和一致性。与公共方法的参数不同,公共方法可以在运行时被任何人调用:我仍然需要通过抛出异常来强制参数约束。 此外,如果某些东西在运行时不起作用(网络错误、数据访问错误、从第三方服务检索到的坏数据等),我的私有方法仍然可以抛出异常。我的断言只是为了确保我没有破坏自己对对象状态的内部假设。 |
|
|
4
52
从…起 Code Complete
|
|
|
5
45
使用资产检查开发人员假设,使用例外检查环境假设。 |
|
|
6
32
如果我是你,我会:
|
|
|
7
25
如果您希望在生产代码(即发布版本)中使用断言,可以使用Trace.Assert而不是Debug.Assert。
此外,如果应用程序在用户界面模式下运行,则默认情况下会显示断言对话框,这可能会让用户感到不安。 您可以通过删除DefaultTraceListener来覆盖此行为:查看MSDN中Trace.Listeners的文档。 总之,
|
|
|
8
22
断言用于捕获程序员(您的)错误,而不是用户错误。只有当用户不可能触发断言时,才应该使用它们。例如,如果您正在编写API,则不应使用断言来检查API用户可以调用的任何方法中的参数是否为null。但是,它可以用在一个私有方法中,而这个私有方法不是作为API的一部分公开的,用来断言代码在不应该传递null参数的情况下从不传递null参数。 当我不确定时,我通常倾向于例外而不是主张。 |
|
9
15
简言之
断言有巨大的好处:
... 更多细节
什么时候使用
可用的合同设计(DBC)检查包括:
|
|
|
10
10
在我的书中几乎没有。 在绝大多数情况下,如果你想检查一切是否正常,如果不正常就扔掉。
我想可能有一些性能关键的场景,您希望优化您的断言,它们在那里很有用,但是我还没有遇到这样的场景。 |
|
|
11
7
作为免责声明,我应该提到,我认为实施这个IRL并不实际。但这是他们的标准。 |
|
|
12
6
|
|
13
6
所有资产应为可优化的代码,以便:
因为它检查的是你已经假设为真的东西。例如。:
在第一种情况下,没有问题。
在第三种情况下,这段代码有问题,因为应该已经检查过了
|
|
14
4
我想我会再添加四个案例,其中Debug.Assert可能是正确的选择。 1) . 举个简单的例子:
然而,实际上引入了一个细微的缺陷,但在测试结果中没有检测到。在这种情况下,被调用方变得不确定,并且 发生 提供预期的结果。或者它产生了一个未被注意到的舍入误差。或者导致了一个在其他地方被同等抵消的错误。或不仅授予请求的访问权限,而且授予不应授予的其他特权。等 此时,被调用方中包含的Debug.Assert()语句与单元测试驱动的新案例(或边缘案例)结合在一起,可以在测试期间提供非常宝贵的通知,告知原始作者的假设已经无效,并且在没有额外审查的情况下不应发布代码。单元测试的断言是完美的合作伙伴。 2) 另外,, . 例如: 如果只能从某个安全入口点访问某个对象,是否应该从每个对象方法对网络权限数据库进行额外查询,以确保调用方具有权限?当然不是。也许理想的解决方案包括缓存或其他一些功能扩展,但设计并不需要它。当对象被附加到不安全的入口点时,Debug.Assert()将立即显示。 接下来,在某些情况下,您的 . 例如: 假设它是一个嵌入式实时设备。在遇到格式错误的数据包时抛出异常并重新启动会适得其反。相反,设备可能会受益于尽力而为的操作,甚至在其输出中渲染噪声。它也可能没有人机界面、日志记录设备,甚至在以发布模式部署时根本无法由人进行物理访问,并且最好通过评估相同的输出来提供错误意识。在这种情况下,自由的断言和彻底的发布前测试比异常更有价值。 最后一点 有些测试是不必要的,只是因为被调用方被认为非常可靠
如果一个核心
|
|
15
4
引自 The Pragmatic Programmer: From Journeyman to Master
|
|
|
16
2
您应该始终使用第二种方法(抛出异常)。
|
|
|
17
0
|
|
|
18
0
我已经阅读了这里的答案,我想我应该添加一个重要的区别。使用资产有两种截然不同的方式。一种是作为一种临时的开发人员快捷方式,“这不应该真的发生,所以如果它确实让我知道,那么我可以决定做什么”,有点像一个条件断点,用于程序能够继续的情况。另一种方法是在代码中加入关于有效程序状态的假设。
但在第二种情况下,断言是代码的一部分。他们断言,你的假设是真实的,并记录下来。在这种情况下,您真的希望将它们留在代码中。如果程序处于无效状态,则不允许继续。如果你负担不起性能冲击,你就不会使用C。一方面,如果调试器发生了,能够附加调试器可能会很有用。另一方面,您不希望堆栈跟踪突然出现在您的用户身上,更重要的是,您不希望他们能够忽略它。此外,如果它在服务中,它将始终被忽略。因此,在生产环境中,正确的行为是抛出异常,并使用程序的正常异常处理,这可能会向用户显示一条漂亮的消息并记录详细信息。
|
|
|
19
-1
|
|
|
20
-2
|
|
|
mozcelikors · 以前未调用函数时给出错误 8 年前 |
|
|
A.Joly · 虽然类型比较在终端中有效,但断言在脚本中无效 9 年前 |
|
|
The Grey Ghost · 线程正确性的断言或注释 10 年前 |