首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
华为云
V2EX  ›  C/C++/Obj-C

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

  •  
  •   v2byy · 132 天前 · 672 次点击
    这是一个创建于 132 天前的主题,其中的信息可能已经有所发展或是发生改变。

    举例:

    编写一个 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 ?

    5 回复  |  直到 2018-07-19 14:55:29 +08:00
        1
    geelaw   132 天前
    首先 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   132 天前 via iPhone
    试试 seh exception
        3
    v2byy   132 天前
    @geelaw 多谢,c lib 是会有异常的,c++下没有
        4
    gnaggnoyil   132 天前   ♥ 1
    补充一下 1L,不仅不同编译器之间的(C++)异常模型是可以不兼容的,甚至同一个编译器使用不同选项编译出来的(C++)异常模型也是可以不兼容的……
        5
    alqaz   125 天前
    我觉得是可以 catch 住的,不然 out_of_memory 之类的异常你是怎么 catch 到的呢?你举得例子错误,为什么还是在网上看到那么多人举例 c++的异常用除零来说事。这类和内存访问错误应该是归为一类吧,你直接把这段代码放到 try 语句块里,无论你怎么 catch 肯定都是崩溃了。你让程序执行到 xxx/0 了,系统认为你的代码肯定出问题了,直接退出了。
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   756 人在线   最高记录 3911   ·  
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.1 · 17ms · UTC 20:16 · PVG 04:16 · LAX 12:16 · JFK 15:16
    ♥ Do have faith in what you're doing.
    沪ICP备16043287号-1