![]() |
1
44
我想这个 article 总结一下。 使用异常的参数
反对使用异常的论据
|
![]() |
2
10
我听过的最好的选择是返回代码而不是异常:
在我自己最近的大量经验中,我可以同情你使用异常的愿望,但不幸的是C++不是C语言,很多在C++中可以逃脱的东西在C++中可能是致命的。 一个很好的总结 the case for and against 可以在 Google's style guidelines . 简而言之:
我建议通读并理解优缺点,然后基于这些为您自己的项目做一个决定。你没有和谷歌一样的软件,所以对他们有意义的可能对你没有意义(这就是为什么我忽略了他们的结论)。 |
![]() |
3
6
imho,1选择异常而不是返回代码的原因是您不能静默地忽略异常。这样做至少需要最少的额外代码。 |
![]() |
4
4
在异常错误条件下使用异常。你有一些很好的论据,我想反驳一些论据。 首先,标准C++库本身使用异常,到处都是。如果没有容器类或iostreams,就不能使用它们。因为很多有用的特性都会用到它们,所以试图在没有它们的情况下相处会带来很多问题。 其次,一旦学会了如何编写异常安全代码并不难。它需要始终如一的RAII,但无论如何你都应该这样写。您应该采用构造提交方法,但这通常是一种优势,并且可以避免一些细微的错误。(例如,使用复制交换方法可以完全消除自分配问题。)根据我的经验,异常安全代码在总体上看起来更好。这是C++程序员必须学习的,但是C++程序员必须学习很多东西,而这并不是那么多。 第三,如果你限制例外情况,应该 minimal effects on performance . 正如Pavel Minaev所指出的,如果必须将错误代码传递给结果,那么就有可能对性能产生影响,因为C++没有设置多个值的简单返回。 第四,很难保证旧代码异常的安全。然而,这是一个新项目。 所以,我没有看到在特殊情况下不抛出异常的好理由,而且有很多理由这样做。 |
![]() |
5
3
在非异常情况下,只需进行一次比较,即可确定是否返回了e_success。
如果有人没有检查异常,那么在您实际收到异常抛出之前很难注意到。如果你处理的是错误代码,你只需看看它们是否在检查它们就知道了。 |
![]() |
6
3
用有意义的东西。我想两者都有一席之地。在某些情况下,错误代码几乎不可能使用(例如,从构造函数返回故障) 其他时候,错误代码只是更方便而已。如果你希望他们发生,他们更容易处理。例外适用于 例外 错误——那些本不应该发生的错误,但在蓝月里可能会发生一次。对于预期会定期发生并可在本地处理的错误,错误代码更加方便。异常在必须在调用堆栈上进一步处理错误的情况下最有用。 此外,在非异常情况下,异常并不一定更快。通常,它们需要函数prolog和epilogs中的额外异常处理代码,每次调用函数时都必须执行这些代码,不管函数是否引发异常。 |
![]() |
7
3
一般来说。当恢复是可能的和预期的,然后使用返回代码。 当无法恢复时 或不需要 然后使用异常。 错误处理是困难的,编写干净的代码,不管有没有异常都是困难的。 由于这是一个新项目,您不必担心旧代码异常的安全性,但是您确实需要担心编写清晰的代码。 在适当的情况下,通过使用异常来实现这一点。 |
![]() |
8
3
由于许多其他人已经提供了在错误代码上使用异常的技术原因,我将给出一个实际的原因。 我在一个复杂的系统上工作,它使用返回代码而不是异常。现在,这是设计得很好的代码,但我敢打赌,平均而言,每个函数中大约70%的代码是错误处理代码。典型的函数如下所示:
代码中充满了这些,很难理解。除此之外,在许多地方返回代码被完全忽略,因为我们知道调用不会失败。每个函数都返回一个ret代码,所以通常作为函数输出返回的内容必须作为out参数返回。而且,所有这些函数都只是在出错时返回retcode,所以我们只是在发生错误时将retcode冒泡到顶部。你不能这样集中你的错误处理策略,它会成为一个混乱的头疼问题。 |
![]() |
9
2
编写异常安全代码是非常困难的。一个完全人为的例子是:
将i++和j++替换为必须保持同步的任意两个变量resources状态。垃圾收集避免了我们必须记住将新的和删除的进行配对。具有讽刺意味的是,老式的显式返回代码测试避免了我们必须仔细分析可能抛出异常的每个函数,以检查它们是否与post条件相冲突。 |
![]() |
10
1
我喜欢C++的一件事是,很容易想到如何用C特性(更容易理解汇编)来实现更高级的功能。C++的异常打破了这个模型。要达到这样的理解水平,我必须做很多事情。刚读 this 在你理解它之前,你会花很多时间挠你的头。 此外,异常要求您有良好的纪律,使您的代码异常安全,资源无泄漏。这意味着要将raii用于任何拥有资源的东西。 此外,当我将异常测量为比简单的返回代码慢很多个数量级时,已经显示了异常。 好吧,然后他们说你应该只在特殊情况下扔,但是你如何沟通那些非特殊的,预期的,经常发生的错误。当然是返回代码!:) 我不知道这些好处值多少钱。 |
![]() |
11
-4
至于反对的理由:
主要是一个。 |
![]() |
rookie · 检查函数模板的所有参数包参数是否属于int 1 年前 |
![]() |
ivaigult · -W转换和隐式字符串到布尔类型转换 1 年前 |
![]() |
rainer · 后台插入程序的初始化 1 年前 |
![]() |
Community wiki · 以理智、安全和高效的方式复制文件 1 年前 |
|
Shefali Kanaujia · 对C中向量的向量进行排序++ 1 年前 |
|
Ma Joonyoung · 粗粒度和细粒度链表的时间比较 1 年前 |