在 c++中可以 catch 到外部的 dll 引发的异常吗? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
v2byy
V2EX    C

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

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

    举例:

    编写一个 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     Solana     4639 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 24ms UTC 09:59 PVG 17:59 LAX 01:59 JFK 04:59
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86