我该如何处理基于C ++的dll中的错误?

时间:2013-07-31 16:44:16

标签: c# c++ dll

我创建了一个C ++ DLL,我在C#应用程序中使用它。我该如何报告错误?
使用异常和throw我的错误,或者在std :: cout或std :: cerr或其他地方打印它们?如果我在我的DLL中发出异常,我的C#应用​​程序是否能够捕获它? 什么是这方面最好的行动方案?

3 个答案:

答案 0 :(得分:1)

请勿在{{1​​}}或stdout上打印错误!您需要以编程方式返回错误,以便C#应用程序有机会处理它们。如果主机应用程序是GUI应用程序怎么办?

从C ++ DLL中抛出异常充满了危险。即使您的应用程序是C ++,也必须使用与DLL完全相同的编译器进行编译,如@ebyrob所说。从C#打电话,我不确定。

最佳做法是返回错误代码。

答案 1 :(得分:1)

以下是来自C#的示例输出,使用PInvoke调用抛出std::exception的方法。

ex = System.Runtime.InteropServices.SEHException (0x80004005): 
 External component has thrown an exception.
   at ConsoleTester.Program.throw_exception()
   at ConsoleTester.Program.Main(String[] args) in ConsoleTester.cs:line 18

注意:在这种情况下,throw_exception()是公开的本机方法,它称为子方法,但是您无法看到堆栈跟踪的那一部分。所有最深的堆栈帧都是原生边界。

所以,它并不完美,但确实有效。返回错误代码可能是处理此问题的最标准方法,但如果您是该库的唯一使用者,它可能不会产生太大的影响。

注意:stdin / stdout通常是处理错误的最糟糕方式。例外情况是编写自定义错误处理对象或一组例程并不是那么糟糕,应用程序中的所有内容都可以在出现问题时访问。 (这样的接口的输出有时可能是stdin / stdout或文件或任何有用的配置)认为log4j或log4net在这里......

通常,日志记录只是错误处理的一部分。您仍然需要发出应用程序的其他部分信号,以响应不利条件并(希望)从它们中恢复。在这里,只有错误代码或异常才能正常工作(并且无论如何都要从主程序流中最小化异常)。

答案 2 :(得分:1)

这实际上取决于错误的强度。我见过的大多数库都会从函数调用中返回成功或失败结果值,您可以在使用它时在代码中手动检查。它们通常提供另一种方法,只是在您想要查看时才会检索错误消息。

为那些你无法继续使用的非常重要的东西保存抛出异常,这将迫使人们使用你的库修复这些错误(或者至少,看看有一个大问题)。

我不建议在控制台窗口中打印任何内容,这是一个非常慢的操作,并且在那里强制使用你的库的任何人都有这个开销,几乎没有优化选项。如果他们想要打印错误消息,他们只需从您的库中检索错误数据并自行打印出来。