用C++写了个Dll,在一导出函数抛一异常,如 throw 1;
把DLL编译一个release版本,用另一程序调用,居然也能在捕捉到这个异常,按我的理解,DLL是一种与语言无关的二进制文件,DLL里没有处理的C++ 异常,应该会导致程序直接崩溃才对,为什么在外面还能捕捉?如果是其它语言用这个DLL,又怎么去处理这个C++异常?请高手指点一二!

解决方案 »

  1.   

    throw 的作用主要是声明一的ERROR的对象,然后将这个对象的指针向上传递,所以你有接口的话,当然可以捕获到这个异常。其他的语言,关键是他们怎么处理接收到的指针。如果匹配的话,估计也可以抛出异常。看机制是不是跟C++的异常处理机制相近或者相似。
      

  2.   

    要是某种语言没有异常处理机制,从DLL里又抛出个异常,那该怎么办
      

  3.   

    throw catch 这一组对应的函数在处理异常时候,并不是每次都处理的,也是进行匹配的。如果你catch的捕获,有的情况下,才可以讲这个对象指针赋值过去,如果没有catch自身都会放弃,何况是一个没有异常处理机制的。
      

  4.   

    我的理解:对windows系统而言,只有结构化异常这一种处理方式(还有一种是__try __finally,就不说它了)。而C++是一种语言,它归根结底也是使用系统提供的结构化异常来实现的。
    1 dll是单独的二进制代码,但它被映射到进程后,进程的结构化异常就应该能够捕获这个异常,所以不会崩溃。
    2 dll使用c++编写,使用throw这样的c++异常,那么调用这个dll的进程最好也使用c++异常。
      

  5.   

    看了ls各位的说法,我有了一点自己的看法系统本身就有已经的异常方式,C++的异常可能只是系统异常在C++里的描述在DLL里抛出一个C++异常实际上就是抛出了一个系统异常这个异常在不同的语言里会是不同的描述,但本质上还是一样的就像接口函数的参数类型,在C++ 里BSTR,C#调用时就是string,但本质(对系统本身)还是一样的各位指正一下...
      

  6.   

    saiyaman5:我认为基本上就是这样。反汇编vc++中都异常处理,经常会见到这样的函数:handler3等等。
    而这些归根结底还是使用了系统都结构化异常,只是包装后代码更少,处理起来更加方便。