【发布时间】:2010-09-29 15:12:00
【问题描述】:
我正在尝试使用 dlopen 函数加载动态库。该库包含一个静态对象,该对象在其构造函数中引发异常。我在 dlopen 调用周围有一个“try-catch(...)”块,但它没有捕获异常,我只看到打印了“Abort”。
我怎样才能捕捉到这个异常?
【问题讨论】:
标签: c++ unix exception shared-libraries dlopen
我正在尝试使用 dlopen 函数加载动态库。该库包含一个静态对象,该对象在其构造函数中引发异常。我在 dlopen 调用周围有一个“try-catch(...)”块,但它没有捕获异常,我只看到打印了“Abort”。
我怎样才能捕捉到这个异常?
【问题讨论】:
标签: c++ unix exception shared-libraries dlopen
简短回答:你不能
再想一想。
原始语句成立,但您还必须记住 dlopen() 是一个 C 库函数。 C 不支持异常。因此,抛出从 C++ 代码到 C(您的全局对象备份到 dlopen() )代码的异常也会导致应用程序终止。
请看这里:Why destructor is not called on exception?
在这些情况下,抛出异常将终止应用程序。您的具体情况包括:
异常转义非局部静态(即全局)的构造函数/析构函数
【讨论】:
globally accessible -->mutable<-- state,其构造可能会导致 main() 范围之外的异常(或仅通过加载)不是一个好主意(单例恰好是这个更大类的子集)。注意:如果我们想学究气,我想不可变状态也会导致问题,但通常不那么令人担忧。