(这就像 my other question 但这是另一回事,即使它是相关的)

我的项目有一个大问题。我有一个处理 XML 并且可以抛出异常的库。并且,使用它来创建配置文件类显示了我的第一个错误:库中根本不处理异常,并且每个异常都没有处理。

在图书馆我写道:

try {
    throw std::exception();
}
catch (...)
{
    printf("caught\n");
}

但是,不处理异常并立即调用 std::terminate :
terminate called after throwing an instance of 'std::exception'
  what():  std::exception

编译标志是最简单的标志:库的 -fPIC -std=c++11 -g -Wall 和可执行文件的 -std=c++11 -g -Wall(加上库和变体构建定义)。另外,我在 Linux 下使用 G++ 5.4.0(准确地说是 Linux Mint)。

这是我的 main :
#include "ns/core/C_Configuration.hpp"

#include <iostream>

using namespace std;
using namespace ns;


int
main (int argc, char** argv)
{
    try {
        C_Configuration c ("test.xml");
        c.load ("test.xml");
    } catch (const std::exception& ex) {
        cout << ex.what () << endl;
    } catch (...) {
        cout << "Caught." << endl;
    }


    return 0;
}
C_Configuration.hpp :
#include <string>
#include <exception>


namespace ns
{


    class C_Configuration
    {

    public:

        C_Configuration (std::string);


        bool load (std::string file);

    };


} // namespace ns

而且,这是 C_Configuration.cpp :
#include "ns/core/C_Configuration.hpp"

#include <cstdio>

using namespace std;


namespace ns
{



C_Configuration::C_Configuration (string)
{ }



bool
C_Configuration::load (string file)
{

    try {
        throw exception();
    } catch (const exception& ex) {
        printf ("In C_Configuration : %s\n", ex.what ());
    } catch (...) {
        printf ("In C_Configuration : caught\n");
    }


    return true;
}


} // namespace ns

构建命令:
g++ -m64 -g -shared -fPIC -std=c++11 -o libns_framework.so C_Configuration.cpp
g++ -m64 -g -L. -o exe main.cpp -lns_framework

注意: 我给出了这个例子,但它按预期工作,异常是在库中捕获的,而不是在我的主项目中。如果你想研究更多,你可以查看我的项目代码 here

问题是当:
  • try-catch 块在库内;
  • try-catch 块在库外;

  • 在任何情况下,异常都会在库中抛出。但是,外部抛出的异常被捕获在可执行代码中:
    int
    main (int argc, char** argv)
    {
        try {
            throw 1;
        } catch (...) {
            cout << "Caught" << endl;
        }
    
        // Useless code
    
        return 0;
    }
    

    此代码仅在输出中写入 Caught

    所以,我的问题很简单:C++ 异常是否不在库中处理,或者我只是忘记了编译标志?我需要在可执行代码中说,异常工作正常。

    谢谢你的帮助。

    编辑: 天哪,我的错。问题解决了。在我的构建配置的最深处,一个 ld 代替了 g++ 。现在异常工作正常。谢谢你的帮助。

    最佳答案

    简单的。切勿将 ld 与 C++ 一起使用。我将项目中的所有 ld 命令更改为 g++ 但似乎我忘记了这个库。

    简而言之,我使用 ld 来构建我的库,但使用 g++ 来构建主可执行文件。因此异常在可执行文件中起作用但在库中不起作用,因为 ld 不包括处理异常系统的 C++ 库。

    关于c++ - Try-catch 在共享库中不起作用?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38878999/

    10-11 18:27