c++ - 反对异常(exception)

标签 c++ exception error-handling

我的一个 friend 向我提出了这个问题。我被困住了,因为我不擅长使用异常。请记住,我们都在使用 C++ 的工作环境中工作,但在 C 传统中进行错误处理。他的问题是这样的:

函数 A 调用 B,后者又调用 CC 抛出一个异常,该异常的 catch block 在 A 中。在调用 C 之前,在 B 中获取的资源会怎样?我们如何清理它们?我的回答是使用 RAII。但即使我说了,我也知道这是行不通的。我们拥有以 C 模式编写的庞大代码库。我在代码中的任何地方都没有看到自动指针等。资源不一定包含在类中。即使是这样,在大多数情况下,析构函数也会留给编译器。简而言之,一切都是手动完成的。

真正的问题是如何从 C 错误处理过渡到具有庞大代码库的异常处理?我 friend 问的问题只是当您熟悉 C 错误处理并想知道如何从那里迁移到异常时可能会提出的问题之一。

最佳答案

Andrei Alexandrescu 和 Joshua Lehrer 开发了一种名为 Scope Guard 的技术它提供了一种技术,可在您分配对象后立即提供“作用域退出”代码,并在此时为其打开作用域。

D 编程语言实际上将其作为标准。

boost 库对此进行了增强,称为 Scope Exit . 如果您的代码不是异常安全的,因为函数 B 似乎不是,如果有任何抛出,它将无法正确处理。

析构函数将在异常后展开调用堆栈时运行。这就是为什么您必须确保他们自己不会抛出任何异常。

关于c++ - 反对异常(exception),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4967250/

相关文章:

c++ - 生成密度不均匀的随机数

c++ - 让键盘进入休眠状态,直到按下特殊字符序列

exception - 可扩展的 "SomeException"如何符合 Haskell 标准?

c# - 无法将类型 'System.Action<mathstester.Program.OperationQuestionScore>'隐式转换为 'mathstester.Program.OperationQuestionScore'

c++ - <<运算符(operator)只打印一个空行

c++ - 将 <vector><string> 转换为 <vector><int> C++, Win32

java - 是否应该抛出没有消息的异常?

Python函数出现异常时返回1

exception - Mulesoft 4中的错误处理未按预期工作

perl - 如何限制 DBIx::Error 中的堆栈跟踪?