exception-handling - 为什么使用断言而不是异常抛出?

标签 exception-handling assert

在我参加 Udacity 的一门关于代码调试的在线类(class)中,教授说在实际代码中最好使用断言而不是异常抛出。

尽管在我的编程生涯中,我从未见过有人使用它。

你知道为什么会这样吗?你同意?

PS:下图是 Python 代码,但我想这个想法适用于所有编程语言。此外,这门类(class)只有 4 个月大,所以我认为所教授的方法是最现代的方法。

enter image description here

最佳答案

断言仅用于调试,并允许您以单行方式检查不变量。断言和类似的宏在测试框架中无处不在。除了异常(exception),你真的需要关心你的库或程序的其余部分在做什么。断言很简单。

它会使程序崩溃,而不会引起任何歧义 - 您的断言导致了它。在调试器中更容易到达那里。异常可能会被捕获并且不会停止程序,或者可能会导致副作用,例如从通常不会发生的地方展开堆栈,调用所有析构函数等,当您并不真正关心它时因为你正在调试。

对于异常,您需要声明要抛出的函数,必须在 C++ 等语言中启用异常。

如果您正在以交互方式调试,而不仅仅是以批处理模式运行测试用例,并且正如您的示例在 Python 中那样,我认为您会发现一个启动 pdb 并在那里停止程序的函数更有帮助。

关于exception-handling - 为什么使用断言而不是异常抛出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15046695/

相关文章:

objective-c - 处理 Objective C 客户端代码中的错误的实践

c++ - 使用C++ catch框架验证assert语句

c# - 抛出 VS 重新抛出 : same result?

c# - 从C#中的异常“ArguementException未由用户代码处理”中获取更多详细信息

rest - spring boot 中 Rest 资源的 NotImplementedException

java - "Method must return a result"调用另一个只抛出异常的方法时

python - 是否可以在脚本中设置 python -O(优化)标志?

java - 使用 ExceptionResolver 捕获 Spring MVC DispatcherServlet 异常

scala - 如何执行三重等于否定

java - AssertContains 在 jUnit 中的字符串上