【问题标题】:dlopen on library with static member that throws exception in constructor - results in Abortdlopen 在具有静态成员的库上在构造函数中引发异常 - 导致中止
【发布时间】:2010-09-29 15:12:00
【问题描述】:

我正在尝试使用 dlopen 函数加载动态库。该库包含一个静态对象,该对象在其构造函数中引发异常。我在 dlopen 调用周围有一个“try-catch(...)”块,但它没有捕获异常,我只看到打印了“Abort”。

我怎样才能捕捉到这个异常?

【问题讨论】:

    标签: c++ unix exception shared-libraries dlopen


    【解决方案1】:

    简短回答:你不能

    再想一想。
    原始语句成立,但您还必须记住 dlopen() 是一个 C 库函数。 C 不支持异常。因此,抛出从 C++ 代码到 C(您的全局对象备份到 dlopen() )代码的异常也会导致应用程序终止。

    请看这里:Why destructor is not called on exception?

    在这些情况下,抛出异常将终止应用程序。您的具体情况包括:

    异常转义非局部静态(即全局)的构造函数/析构函数

    【讨论】:

    • 显而易见的推论:(1)全局变量,嗯..ahem..“单身人士”是不好的。麦凯? (2) 从打算用作单例的对象的构造函数中抛出异常更糟糕。 (3) 库代码不应该做任何可能导致调用程序中止的事情,除非合约被破坏(比如传递一个无效的指针。
    • @R..:完全同意。我认为我们不需要将单身人士拖入其中。我们正在寻找的短语是globally accessible -->mutable<-- state,其构造可能会导致 main() 范围之外的异常(或仅通过加载)不是一个好主意(单例恰好是这个更大类的子集)。注意:如果我们想学究气,我想不可变状态也会导致问题,但通常不那么令人担忧。
    • 如果它真的是不可变的,我不会称它为“状态”。但在我的书中,任何具有修改其内容的构造函数的对象都是“可变的”,即使在构造之后没有方法可以更改它。
    猜你喜欢
    • 2011-03-15
    • 2011-06-11
    • 1970-01-01
    • 2013-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多