【发布时间】:2016-11-07 15:34:58
【问题描述】:
假设我的应用程序由 3 个组件组成。它们是:
- c++ 原生库
- c++ cli 管理库,封装了原生库
- c# gui 应用程序。
据我了解,从本地 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));
}
}
也许这种方法存在一些缺陷?感谢您的任何建议。
【问题讨论】:
-
没有明显的理由要更改此代码中的任何内容。除了异常类型名称之外,“UnmanagedException”可能更有意义,因为它就是从那里来的。除了错误报告之外,C# 代码不太可能用它做任何合理的事情,您可以提供的细节越多越好。
-
@Hans Passant,据我了解,通过原生对象捕获异常比通过 appprop 更可取。包裹托管一个? docs 说:如果一个非托管类型被 catch(Object^) 捕获,它不会破坏抛出的对象。
-
当您在 sn-p 中编写“NativeException”时,每个人都会认为这是一个原生 C++ 类型。这不仅很好,而且需要从异常对象中获取任何信息。在没有任何相关信息的情况下传递异常是一个非常非常糟糕的主意。它仍然可以工作,但你的 C# 代码当然只能终止程序。所以原生异常对象是否泄露根本不重要。
标签: c# exception-handling c++-cli