在 dotnet core 中捕获本机异常
Posted
技术标签:
【中文标题】在 dotnet core 中捕获本机异常【英文标题】:catch native exception in dotnet core 【发布时间】:2018-06-14 06:55:47 【问题描述】:在使用 pinvoke 并在 linux 上运行的 dotnet 核心应用程序中,当 c++ 抛出 - 例如 - std::runtime_error
- 我们得到:
terminate called recursively
terminate called after throwing an instance of 'terminate called after throwing an instance of 'std::runtime_error*'
Aborted (core dumped)
即使外部 c++ 方法的调用被包装在托管代码中的 try catch 块中。
如何在 dotnet 核心托管代码中捕获和处理它?
【问题讨论】:
如果您能提供minimal reproducible example,那就太好了。 注意回复 ***.com/a/151329/613130 。你应该使用try ... catch ...
(无异常类型)
请注意,我的问题是指在 linux 上执行的 dotnet 核心,而不是 Windows 上的 dotnet 框架。这仍然是重复的吗?
@levhaikin 可能不会……
@levhaikin 你试过没有类型的空白try... catch
吗?
【参考方案1】:
我设置了 this Minimal, Complete and Verifiable example,它演示了如何在 Linux 上由托管 C# .NET Core 代码不捕获任何本机异常。
如the issue I opened for dotnet/coreclr
中所述,我已经尝试过(m)武器库中任何可能的武器,但无济于事。
dotnet 团队给出的直接答案是:
我们不支持 Unix 上的异常处理互操作。没有好的方法可以做到这一点。 Mono 项目在这里有一篇很棒的文章:http://www.mono-project.com/docs/advanced/pinvoke/#runtime-exception-propagation。同样的道理也适用于 .NET Core。
同样被dotnet团队推荐的Mono项目的解决方案是:
C++ 异常需要映射到“out”参数或返回值,以便托管代码知道发生了什么错误,并(可选)抛出托管异常以“传播”原始 C++ 异常。
这就是我们最终实施的方法,而且,它确实有效:)。
【讨论】:
以上是关于在 dotnet core 中捕获本机异常的主要内容,如果未能解决你的问题,请参考以下文章