(这就像 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 。
问题是当:
在任何情况下,异常都会在库中抛出。但是,外部抛出的异常被捕获在可执行代码中:
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/