在 c++中可以 catch 到外部的 dll 引发的异常吗?

2018-07-12 15:57:23 +08:00
 v2byy

举例:

编写一个 c lib,定义一个 export function:

int devide_by_zero()
{
	int a=1;
    int b=0;
    return a/b;
}

另起一个 client 工程,调用这个 c lib,使用 try catch,无法 catch 到这个异常。

有什么方法可以在 c++中 catch 到这个异常呢,保持 client 端程序不 crash ?

2383 次点击
所在节点    C
5 条回复
geelaw
2018-07-12 16:07:25 +08:00
首先 1/0 不会引发 C++ exception,其次,一般来说跨 native assembly boundary 做异常处理是很坏的想法,因为不同 C++ 编译器的异常对象可以是不兼容的(无法 recognise each other )。

要在 Visual C++ 中处理例子中的异常,你可以使用 SEH,见 https://docs.microsoft.com/en-us/cpp/cpp/structured-exception-handling-c-cpp

最佳实践:native assembly 接口用错误代码指示错误,必须处理所有可能处理的情况;跨 native assembly 的未处理异常指示程序应该崩溃。
zynlp
2018-07-12 16:14:43 +08:00
试试 seh exception
v2byy
2018-07-12 16:38:55 +08:00
@geelaw 多谢,c lib 是会有异常的,c++下没有
gnaggnoyil
2018-07-12 22:59:33 +08:00
补充一下 1L,不仅不同编译器之间的(C++)异常模型是可以不兼容的,甚至同一个编译器使用不同选项编译出来的(C++)异常模型也是可以不兼容的……
alqaz
2018-07-19 14:55:29 +08:00
我觉得是可以 catch 住的,不然 out_of_memory 之类的异常你是怎么 catch 到的呢?你举得例子错误,为什么还是在网上看到那么多人举例 c++的异常用除零来说事。这类和内存访问错误应该是归为一类吧,你直接把这段代码放到 try 语句块里,无论你怎么 catch 肯定都是崩溃了。你让程序执行到 xxx/0 了,系统认为你的代码肯定出问题了,直接退出了。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/470264

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX