我在调用一个外部非托管的COM时,如果COM内部发生了错误将导致程序崩溃,使用try...catch也是一样,但在.Net中调试时,在输出窗口中会输出该COM中发生错误的地方。请问有什么办法能在应用程序中捕获这个出错信息,至少不让程序崩溃?谢谢!

解决方案 »

  1.   

    因为Com不受.net 托管,所以不能控制其内部错误.没办法的.
      

  2.   

    to chsfly(一蓑烟雨任平生):
    既然在.Net调试输出窗口中能输入该COM中发生错误的地方,就说明至少.Net是可以捕获到这些错误的
      

  3.   

    VS的调试器是托管和非托管混合编写的,所以两种类型的错误都能捕获。
    纯托管代码并不能处理非托管类型的错误,chsfly并没有说错
      

  4.   

    打包调试器有什么用?调试器是用来发现错误的,而不是让错误不发生的。
    能做的就是在COM中好好处理错误,不要让错误蔓延到托管环境中。
      

  5.   

    现在修改COM时间不允许啊,只能在下个版本再考虑修改COM了,现在就是不能让应用程序崩溃
      

  6.   

    应该能够catch得到啊,.NET框架能够识别大多数COM异常,而且,如果系统不认识,则会抛出System.Runtime.InteropServices.COMException异常哈。嗯。。如果把COM放在另一个线程里调用不知会怎样。。
      

  7.   

    COMException和threadException都是从System.Exception这个基类继承来的,光Catch都不行,这两个肯定也不行,我也在MSDN中查了关于非托管异常的处理方法,但是没有太多的参考价值
      

  8.   

    如果是使用标准的COM异常方法抛出的,Net应该能识别出来。
    如果是运行库异常或者C++异常.Net就没办法处理了。
    非托管的异常还是要在非托管环境下解决,如果能知道是什么类型的异常的话,可以给COM组件再作一层包装,在包装里面捕捉异常。可以参考SetUnhandledExceptionFilter。
    另外一个思路是把程序分成两个进程或者用Net中的应用程序域,让出问题的部分不会影响整个程序
      

  9.   

    try {
        //...   
    }
    catch (COMException comExc) {
        // TODO: Handle COM exceptions.
    }
    catch (Exception e) {
        // TODO: Handle exceptions.
    }