【问题标题】:Catch std exception and System Exception in mixed C++在混合 C++ 中捕获标准异常和系统异常
【发布时间】:2013-10-14 11:00:37
【问题描述】:

在混合代码 C++ 应用程序中捕获 std 和 System 异常的正确方法是什么?

喜欢这样吗?

try
{
    // using pure C++ and managed components
}
catch(std::exception exp)
{
}
catch(System::Exception sexp)
{
}

【问题讨论】:

    标签: c++ exception clr


    【解决方案1】:

    通过引用捕获异常。托管异常的硬性要求,对于本机 C++ 异常是可选的,但仍然是一个好主意。只是拼写不同:

    try {
        // stuff
    }
    catch (std::exception& ex) {
    }
    catch (System::Exception^ ex) {
    }
    

    然而,包罗万象的异常处理几乎从来都不是一个好主意。

    【讨论】:

      【解决方案2】:

      通过引用捕获它们以避免对std::exception 的派生异常进行切片:

      catch (std::exception &exp)
      

      这样您就可以正确捕获所有派生异常。 (多态性)

      【讨论】:

      • 良好实践或所有原生异常!只有当库明确规定必须通过指针捕获异常时,您才必须通过指针捕获。
      • @Henno:天哪,有图书馆可以做到这一点吗?那太糟了。他们的图书馆以何种方式被破坏以至于需要这样做?
      • 不!我确实是用另一种方式表示的:当 YOU 正在使用其他人的 nativ 库时,那么...
      【解决方案3】:

      请阅读this MS-Blog-Post。 特别是它说:“一般来说,处理托管代码中的本机错误/异常更容易,相反......” 托管异常以 SEH-Exceptions 的形式到达本机部分,与托管异常相比,信息更少。

      所以,不,您的代码 sn-p 不正确。

      【讨论】:

        猜你喜欢
        • 2010-10-11
        • 1970-01-01
        • 1970-01-01
        • 2012-02-14
        • 1970-01-01
        • 2011-07-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多