好的,一般来说,异常处理高度依赖于操作系统。我将做出一些假设并尝试提供一些通用指导。请知道,这绝不是详尽无遗的回复,但应该作为一个起点。
我将假设:
在大多数情况下,你对防止内存泄漏感兴趣。
你不关心Windows(它是完全不同的东西),因为你提到了dlopen(否则你会说LoadLibrary)
你已经意识到链接C++符号的细微差别。如果你没有,请在dlopen c ++ mini howto上阅读相关内容
一般来说
没有一般解决方案可以解决所描述的问题,而不涉及专门提供数据和代码段沙箱的操作系统。有可信系统和专业操作系统内核可以实现此功能,但我假设您想在旧的*nix或Windows环境中执行此操作。
编译器的东西进一步复杂化了问题(你的C++编译器默认生成弱符号吗?通常会这样做)。这会影响try-catch中发生异常的方式。
简单的操作系统异常处理引发信号(SIGSEGV,SIGFPE等):
在支持sigaction的POSIX系统下...
假设您想保护通用事项,例如错误的内存寻址。在dlopen库之前使用sigaction捕获SIGSEG(以保护.init函数),然后在调用库中的函数之前进行信号检查。考虑使用SA_STACK确保您的处理程序跳转到您完全控制的堆栈中,并使用SA_SIGINFO确保您的处理程序获取有关源的信息。
一个很好的起点是GNU libc手册上的信号处理
在C++中:使用包装器和try-catch捕获软件异常
try { foo(); } catch() { // do something }
其中foo是指向dll中函数的弱符号。请参见c ++ dlopen mini-howto以获取更多示例和有关加载类等的详细信息。
如果您有更具体的需求,请发布它们,我会看看是否可以提供更多信息。
干杯
exec()
一些最小的存根,只获取库调用所需的必要数据,执行调用并传递结果。 - che