举例:
编写一个 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 ?
1
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 的未处理异常指示程序应该崩溃。 |
2
zynlp 2018-07-12 16:14:43 +08:00 via iPhone
试试 seh exception
|
4
gnaggnoyil 2018-07-12 22:59:33 +08:00 1
补充一下 1L,不仅不同编译器之间的(C++)异常模型是可以不兼容的,甚至同一个编译器使用不同选项编译出来的(C++)异常模型也是可以不兼容的……
|
5
alqaz 2018-07-19 14:55:29 +08:00
我觉得是可以 catch 住的,不然 out_of_memory 之类的异常你是怎么 catch 到的呢?你举得例子错误,为什么还是在网上看到那么多人举例 c++的异常用除零来说事。这类和内存访问错误应该是归为一类吧,你直接把这段代码放到 try 语句块里,无论你怎么 catch 肯定都是崩溃了。你让程序执行到 xxx/0 了,系统认为你的代码肯定出问题了,直接退出了。
|