gpt4 book ai didi

c++ - 您如何跟踪每个功能提供的异常安全保证

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:16:02 26 4
gpt4 key购买 nike

在编写异常安全代码时,需要考虑所有被调用函数的异常安全保证(none、basic、strong 或 no-throw)。由于编译器没有提供任何帮助,我认为函数命名约定在这里可能会有帮助。是否有某种既定的符号标准表明功能提供的异常安全保证级别?我在想类似匈牙利语的东西:

void setFooB(Foo const& s); // B, offers basic guarantee
int computeSomethingS(); // S, offers strong guarantee
int getDataNT() throws(); // NT, offers no-throw
void allBetsAreOffN(); // N, offers no guarantee

编辑:我同意这种命名约定很丑陋的评论,所以请允许我详细说明我提出建议的原因。

假设我重构了一些代码,并在该过程中更改了函数提供的异常安全级别。如果保证已经从强变化到基本(也许通过速度的提高证明是合理的),那么每个调用重构函数的函数都必须重新考虑它们的异常安全性。如果 guarante 的改变也触发了函数名的改变,它会让编译器帮我一点点,至少标记所有对改变函数的使用。这是我建议上述命名约定的理由,尽管它是有问题的。这与 const 非常相似,其中函数的 const-ness 的变化会对其他调用函数产生级联效应,但在这种情况下,编译器会提供非常有效的帮助。

所以我想我的问题是,人们养成什么样的工作习惯才能确保代码真正满足他们预期的异常保证,尤其是在代码维护和重构期间。

最佳答案

我经常发现自己在注释 (doxygen) 中记录,除了 no throw 保证,我经常用 throw() exception specification 当且仅当确定该函数保证 不会抛出异常安全性很重要时。

也就是说,我通常更担心代码中未处理的异常会导致问题的部分异常,并在本地处理(通过其他方式确保您的代码是异常安全的,如 RAII,在外部执行工作并然后用无抛出操作合并结果——即无抛出交换,这是我主动标记为 throw() 的唯一函数。

其他人可能有其他经历,但我发现这足以满足我的日常工作。

关于c++ - 您如何跟踪每个功能提供的异常安全保证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7052857/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com