我已经创建了一个C++ DLL,并且正在C#应用程序中使用它。我应该如何报告错误?
使用异常和throw
我的错误,或打印他们在std :: cout或std :: cerr,或其他?如果我在DLL中发出异常,我的C#应用程序是否能够捕获它?
什么是这方面的最佳行动方案?我应该如何处理基于C++的dll中的错误?
回答
下面是使用PInvoke调用一个抛出std::exception
的方法的C#示例输出。
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通常是处理错误的最糟糕的方法。例外情况是编写自定义错误处理对象或一组例程以避免出现错误时应用程序中的所有内容都可以访问。 (这种接口的输出有时可能是标准输入/标准输出或文件或任何有用的配置)认为log4j或log4net在这里...
通常,日志记录只是错误处理的一部分。您仍然需要向应用程序的其他部分发出信号,以对不利条件做出反应并(希望)从其中恢复。在这里,只有错误代码或异常真的起作用(并且反正主程序流程中的异常会被最小化)。
请勿在stdout
或stderr
上打印错误!您需要以编程方式返回错误,以便C#应用程序有机会处理它们。如果主机应用程序是一个GUI应用程序呢?
从C++ DLL中抛出异常充满了危险。即使您的应用程序是C++,也必须使用与DLL完全相同的编译器进行编译,如@ebyrob所述。从C#调用,我不确定。
最佳的操作过程是返回错误代码。
这真的取决于错误的强度。我见过的大多数库都会从其函数调用中返回成功或失败结果值,您可以在代码中使用它时手动检查结果值。他们通常会提供另一种方法,只是在您想要查看时才检索错误消息。
为真正的大事保留抛出异常,你不能继续没有,这将迫使人们使用你的库来修复这些错误(或者至少,看到有一个大问题)。
我不会推荐在控制台窗口中打印任何东西,这是一个非常缓慢的操作,并且在那里强制任何人使用你的库来获得这些开销,而没有什么优化选择。如果他们想打印错误消息,他们可以从库中检索错误数据并将它们自行打印出来。
- 1. 我应该如何处理“错误”命名的dll?
- 2. 我应该如何处理sqlite错误?
- 3. 我应该如何处理Codeigniter应用程序中的错误
- 4. 我该如何处理C++中的类重定义错误?
- 5. 我应该如何处理API中的错误?
- 6. 我该如何处理idhttp错误?
- 7. 我该如何处理Doctrine错误?
- 8. 我应该如何优雅地处理错误的AppDomains?
- 9. 我的程序应该如何处理错误?
- 10. PHP OO - 我应该如何处理多个类的软错误?
- 11. 我应该如何处理未修复的错误测试
- 12. 我应该如何处理我的pg_log?
- 13. 如何解决基于ARM的处理器中的EGLUT错误?
- 14. 如何在基于C的dll或基于CLI的dll中打包C++类?
- 15. 我该如何处理DLL文件在C#
- 16. 在基于Redux的应用程序中处理请求错误
- 17. 我应该如何处理Objective-C库中的日志?
- 18. 我应该如何处理C++中的不一致对象?
- 19. 我应该如何处理D中的C字符串?
- 20. 我应该如何处理c/windows中的windows/linux路径
- 21. 我该如何处理php中的mysql错误?
- 22. 我该如何处理Javascript中的这种错误?
- 23. 我该如何处理jQuery中的多个ajax错误
- 24. 我应该怎样处理我的C++项目所依赖的dll?
- 25. 我应该如何处理间歇性MS Access错误?
- 26. 处理错误消息,我应该如何编写drawgrid函数?
- 27. 我该怎么处理在C++中处理错误的数据类型
- 28. C# - 处理基于事件的WCF代理中的错误例外
- 29. 我将如何去处理在C#中的Powershell对象的错误处理?
- 30. 我应该处理的XmlNodeList
“C++ dll”是什么意思?你是否使用'extern'或类似的方式公开本地类?通常DLL应该是“C DLL”(可能用C++编写)或“COM DLL”或“托管装配”。创建直接公开本机C++对象的DLL通常是一个坏主意,因为如果没有生成它的确切编译器版本,很难链接。 – 2013-07-31 16:48:07
答案很大程度上取决于您的C++代码是否管理。 –
是的,我使用了extern C,而我的C++没有管理。 – Breeze