标准异常 - throw new exception c++




C程序能处理C++异常吗? (4)

C没有例外,因此一般来说你应该捕获所有异常并返回一个错误代码和/或提供一个返回最后一个错误信息的函数。

我正在开发可以由C或C ++应用程序使用的C ++组件dll。 暴露的dll函数如下

#include <tchar.h>
#ifdef IMPORT
#define DLL __declspec(dllimport)
#else 
#define DLL __declspec(dllexport)
#endif

extern "C" {

    DLL  bool __cdecl Init();
    DLL  bool __cdecl Foo(const TCHAR*);
    DLL  bool __cdecl Release();

}

这些函数的内部实现是没有公开的C ++类,我假定使用这种风格的DLL可以在C或C + +应用程序中使用。 问题是我不处理任何类型的c + +异常(即bad_alloc),我把这东西留给调用者(更高层)。 经过与我的同事多次辩论,我应该赶上所有的异常,并返回错误代码或至少是错误的,因为在C应用程序的情况下,它不能处理C ++异常? 真的吗? 我应该怎样做呢? 如果您正在开发将由其他系统使用的组件,是否有处理免除的经验法则?


作为一般规则,您绝对不应允许C ++异常在模块边界之外传播。 这是因为C ++标准没有规定如何实现异常传播,因此这是编译器(和编译器标志)和操作系统的依赖。 您不能保证调用您的模块的代码将使用与您的模块具有相同编译器标志的相同编译器进行编译。 事实上,正如你用这个问题来演示的那样,你不能保证调用你的模块的代码将被写成相同的语言。

有关更多详细信息,请参阅Sutter和Alexandrescu在C ++编码标准中的第62项。


如果这是使用MSVC的Windows,那么是的,你可以在C中捕获异常,但你不能抓住它们。 C ++异常通过操作系统ABI的结构化异常处理机制提供,而Microsoft有一个__try,__except,__finally C扩展来处理OS结构化异常。 请注意,这些包括访问违规,零分等,您通常要终止您的程序并记录一个错误报告。 您可以通过代码0xE04D5343(4D 53 43 =“MSC”)来识别C ++异常,并将剩下的内容抛出。

也就是说,你可能不想在DLL边界上抛出异常,当然,如果你只是暴露一个C API。


如果调用者被设计为处理它们,则只传播异常给调用者。 我想在你的情况下,一旦任何异常转义C ++代码,将立即调用terminate()因为从C ++运行库的角度来说,异常还没有被处理。

COM服务器设计中也出现了同样的情况 - 客户可以使用任何语言/技术。 rul是没有例外应该转义COM服务器方法 - 所有异常都必须在HRESULT和(可选) IErrorInfo中被捕获和转换。 你应该在你的情况下做类似的事情。

如果C代码夹在两层C ++代码之间,那么将异常传播到C代码仍然是一个非常糟糕的主意 。





exception-handling