我不问C++异常是否可以通过C代码传播,也不会在发生这种情况时发生什么。我已阅读SO(1,2,3)和中的以下问题。我问如何进行:混合C和C++代码时确保异常传播的机制
- 避免泄漏对C代码的任何C++异常(这意味着调用C代码之前捕捉在C++土地所有异常)
- 还能够赶上之外的例外C代码(在更高的C++代码中)。
让我说明了我的想法:
说libfoo
是一个C库,我想在我的bar
C++程序中使用。 libfoo
需要我必须提供的回调函数foo_callback
。该函数和方法在我的回调使用可能会抛出异常,所以我写了:
void my_callback(void)
{
try
{
// Do processing here.
}
catch(...)
{
// Catch anything to prevent an exception reaching C code.
// Fortunately, libfoo provides a foo_error function to
// signal errors and stop processing.
foo_error() ;
}
}
然后我用我的回调,如下图所示:
// The bar program.
int main()
{
// Use libfoo function to set the desired callback
foo_set_callback(&my_callback) ;
// Start processing. This libfoo function uses internally my_callback.
foo_process() ;
// Check for errors
if(foo_ok())
{
// Hurray !
}
else
{
// Something gone wrong.
// Unfortunately, we lost the exception that caused the error :(
}
}
我要的是能够赶上在main
函数中从my_callback
中抛出的异常没有例外通过libfoo
传播(是的,这是通过C代码实验quantum tunnelling的一种量子异常)。
所以我很想代码使用方法:
void my_callback(void)
{
try
{
// Do processing here.
}
catch(...)
{
// Catch anything to prevent an exception reaching C code.
// We save the exception using (the magic) ExceptionHolder.
ExceptionHolder::Hold() ;
// Call foo_error function to signal errors and stop processing.
foo_error() ;
}
}
// The bar program.
int main()
{
// Use libfoo function to set the desired callback
foo_set_callback(&my_callback) ;
try
{
// Start processing. This libfoo function uses internally my_callback.
foo_process() ;
// Once gone out of the C land, release any hold exception.
ExceptionHolder::Release() ;
}
catch(exception & e)
{
// Something gone wrong.
// Fortunately, we can handle it in some manner.
}
catch(/*something else */)
{
}
// ...
}
考虑以下限制:
libfoo
是源封闭,用C语言编写,并从供应商处编译格式提供。在图书馆进行的测试表明,例外不能通过它传播。我无法访问源文件,也无法获得支持异常的编译版本。- 回调函数广泛使用使用异常的C++代码。所有的错误处理都是围绕异常机制构建的。绝不能简单地使用吞下所有异常的代码。
- 不涉及多线程。
- 没有C++ 0x支持。
我的问题:
- 是它已经被一些图书馆或一些C++魔法(比如
boost
),甚至的C++ 0x解决了吗? - 如果不是,我该如何编写一个适用于任何异常类型的ExceptionHolder?我用C++很舒服,但我还没有找到一种方法来编写一个可靠且易于使用的ExceptionHolder,它适用于任何异常类型。
非常感谢您的任何建议!
编辑:我加一点点实施例外保持/释放机构的响应。所有的评论家或主张都是受欢迎的。
这也许值得一提的是,升压方法反映比较直接的是已被引入到标准库中的C++ 0x解决同一问题的机制。但是,从我所知道的情况来看,它们有点神奇。 – ben
谢谢!我会调查你的提议,因为它似乎很有前途:) – overcoder
在使用'boost :: enable_current_exception'后,我发现它几乎没有灵活性,因为它强制用户用'boost :: enable_current_exception'来包围所有异常所有可能的投掷网站,然后才能使用它。在当前的代码库中,我无法承受这个* major *重构。 – overcoder