我的一个 friend 向我提出了这个问题。我被困住了,因为我不擅长使用异常。请记住,我们都在使用 C++ 的工作环境中工作,但在 C 传统中进行错误处理。他的问题是这样的:
函数 A
调用 B
,后者又调用 C
。 C
抛出一个异常,该异常的 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/