V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
v2byy
V2EX  ›  C

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

  •  
  •   v2byy · 2018-07-12 15:57:23 +08:00 · 2483 次点击
    这是一个创建于 2327 天前的主题,其中的信息可能已经有所发展或是发生改变。

    举例:

    编写一个 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
    geelaw
        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 的未处理异常指示程序应该崩溃。
    zynlp
        2
    zynlp  
       2018-07-12 16:14:43 +08:00 via iPhone
    试试 seh exception
    v2byy
        3
    v2byy  
    OP
       2018-07-12 16:38:55 +08:00
    @geelaw 多谢,c lib 是会有异常的,c++下没有
    gnaggnoyil
        4
    gnaggnoyil  
       2018-07-12 22:59:33 +08:00   ❤️ 1
    补充一下 1L,不仅不同编译器之间的(C++)异常模型是可以不兼容的,甚至同一个编译器使用不同选项编译出来的(C++)异常模型也是可以不兼容的……
    alqaz
        5
    alqaz  
       2018-07-19 14:55:29 +08:00
    我觉得是可以 catch 住的,不然 out_of_memory 之类的异常你是怎么 catch 到的呢?你举得例子错误,为什么还是在网上看到那么多人举例 c++的异常用除零来说事。这类和内存访问错误应该是归为一类吧,你直接把这段代码放到 try 语句块里,无论你怎么 catch 肯定都是崩溃了。你让程序执行到 xxx/0 了,系统认为你的代码肯定出问题了,直接退出了。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2813 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 09:37 · PVG 17:37 · LAX 01:37 · JFK 04:37
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.