如何处理本机代码中的异常?

时间:2016-11-07 15:34:58

标签: c# exception-handling c++-cli

假设我的应用程序由3个组件组成。他们是:

  1. c ++ native library
  2. c ++ cli托管库,包装本机库
  3. c#gui application。
  4. 据我所知,从本机c ++库抛出的任何本机异常都将包含在SEHException托管类中。我对后续步骤感兴趣,建议在创建此类异常对象后执行的操作。

    我应该在c ++ cli托管库中捕获所有这些可能的异常,然后创建一个适当的托管异常吗?像这样:

    void some_managed_action()
    {
        try
        {
           native_object->some_native_action();
        }
        catch (const NativeException& e)
        {
           // What should I do with exception e and native object? before throwing new managed exception
           // Will SEH wrapper automatically delete native exception object
           // delete all native objects?
           throw gcnew ManagedException(get_message(e));
        }
    }
    

    这种方法可能存在一些陷阱吗?谢谢你的任何建议。

1 个答案:

答案 0 :(得分:1)

使用

try 
{
} 
catch (Exception ex) 
{
    // .NET exception
} 
catch 
{
    // native exception
}
  

处理Exception的catch块捕获所有公共语言   规范(CLS)兼容的例外。但是,它没有抓住   符合非CLS的异常。符合非CLS的例外情况可以是   从本机代码或由生成的托管代码抛出   Microsoft中间语言(MSIL)汇编程序。注意C#   和Visual Basic编译器不允许非CLS兼容的异常   抛出,Visual Basic不会捕获非CLS兼容   例外。如果catch块的意图是处理所有   异常,使用以下常规catch块语法。

     

C#:catch {}

CA2102: Catch non-CLSCompliant exceptions in general handlers