【发布时间】:2013-09-10 16:24:00
【问题描述】:
我在 C# 项目中重用了一大块非托管 C++ 代码。非托管 C++ 代码封装在托管 C++ 代码层中,该层与 C# 代码交互。现在,非托管 C++ 代码使用 assert(false) 来引发严重错误。由于 assert() 写入 stderr 并且我的项目是一个 GUI 程序,我认为断言打印输出不会出现。我正在考虑用 throw new exception(...) 替换 assert(false),然后在 C# GUI 层捕获并显示异常。我的问题是:
1) 用 exception() 替换 assert() 是个好主意吗?如果不是为什么?
2) 如果在非托管 C++ 代码中引发异常,它们会正确传播到托管 C++,然后传播到 C# 代码(堆栈跟踪完整且正确)吗?
谢谢,
【问题讨论】:
-
首先使用
assert作为错误处理程序是个坏主意。如果定义了NDEBUG,则无效。assert将在控制台应用程序中写入stderr并在 GUI 应用程序中调用MessageBox。这将是可见的(无论如何在调试版本中)。 -
@llnspectable 是的,我知道断言在发布版本中被编译出来。我对此很满意。我最关心的是在发生错误时获取堆栈跟踪。 assert 只写入 GUI 程序没有的 stderr,所以这对我来说是更大的缺点。
-
assert() 的默认行为是调用调试器中断。不要搞砸了。
-
@Hans documentation 不同意你的说法。