这是我做的,我想优雅地处理这个例外:
code_snippet:my.cpp
#include<iostream>
extern "C" void some_func()
{
throw "(Exception Thrown by some_func!!)";
}
code_snippet:exception.c
#include <stdio.h>
extern void some_func();
int so_main()
{
some_func();
return 0;
}
从上面的两个片段中,我使用以下命令创建了一个shared_object libexception.so:
g++ -c -fPIC src/my.cpp
gcc -c -ansi -fPIC src/exception.c
g++ -fPIC -shared -o libexception.so
然后我从main.cpp调用了函数so_main code_snippet:main.cpp
#include<iostream>
#include <dlfcn.h>
using namespace std;
extern "C" void some_func();
int main()
{
int (*fptr)() = 0;
void *lib = dlopen("./libexception.so", RTLD_LAZY);
if (lib) {
*(void **)(&fptr) = dlsym(lib, "so_main");
try{
if(fptr) (*fptr)(); <-- problem lies here
//some_func(); <-- calling this directly won't crash
}
catch (char const* exception) {
cout<<"Caught exception :"<<exception<<endl;
}
}
return 0;
}
最终命令:g ++ -g -ldl -o main.exe src / main.cpp -L lib / -lexception
执行main.exe崩溃。有人可以帮助我找出问题所在以及如何避免这种崩溃发生(我们已经有一些架构,其中一些.SO调用extern c ++函数,因此无法更改,我们只想在main.cpp中处理它)
答案 0 :(得分:6)
尝试使用src/exception.c
-fexceptions
-fexceptions 启用异常处理。生成传播异常所需的额外代码。对于某些目标,这意味着GNU CC将为所有函数生成帧展开信息......
但是,在编译需要与使用C ++编写的异常处理程序正确互操作的C代码时,可能需要启用此选项。如果要编译不使用异常处理的旧C ++程序,您可能还希望禁用此选项。
答案 1 :(得分:1)
该函数可能抛出一个不是 char * 的异常,所以你没有抓住它。
尝试使用广义捕获:
*(void **)(&fptr) = dlsym(lib, "so_main");
try{
if(fptr) (*fptr)(); <-- problem lies here
//some_func(); <-- calling this directly won't crash
}
catch (char const* exception) {
cout<<"Caught exception :"<<exception<<endl;
}
catch (...) {
cout<<"Caught exception : Some other exception"
}