在C#中,Debug.Assert可以设置为抛出异常而不是弹出窗口吗?

4
我希望在我的C#应用程序中,当断言失败时,抛出异常并使编辑器跳转到该位置。但是,弹出了一个“中止/重试/忽略”消息框。有没有办法控制这种行为?

你有阅读文档吗?http://msdn.microsoft.com/zh-cn/library/e63efys0.aspx - John Saunders
2个回答

3
您可以添加自定义的TraceListener,在.Fail()方法中抛出异常:
public class ThrowListener : TextWriterTraceListener
{
    public override void Fail(string message)
    {
        throw new Exception(message);
    }

    public override void Fail(string message, string detailMessage)
    {
        throw new Exception(message);
    }
}

我建议你自己创建一个异常类型,它接受消息和详细消息,这样就更容易知道异常来自哪里。

当调试器直接跳转到throw时,你需要向上一级调用堆栈的.Assert()调用。

你可以像这样添加它:

Debug.Listeners.Insert(0, new ThrowListener());

2
不直接地:这就是Debug.Assert所做的事情。请参阅文档。

http://msdn.microsoft.com/en-us/library/system.diagnostics.debug.aspx

也许您想使用除 Debug.Assert 之外的其他东西?例如,如果无法处理,则仅抛出异常,或在需要时调用一些应用程序定义的 onError 处理程序?
另外,您可以通过添加侦听器并钩入该侦听器来获得所需的内容。请参阅文档。

1
@AlexeiLevenkov:文档说明Assert的作用是显示包含调用堆栈的消息。也就是说,这是主要目的。(例如:"检查条件;如果条件为false,则显示一个消息框,其中显示调用堆栈。")我很乐意改变我的答案,但我想知道它为什么是错误的。(请注意,我认为问题的标题是问题的一部分) - Arafangion
@Arafangion 我必须同意你的观点。我不会说Debug.Assert可以设置为抛出异常,因为那意味着内置功能。它可能被某种方式“黑掉”以抛出异常,但你已经提到了这点。我没有深入讨论,因为在我完成代码示例之前,你已经回答了。 - TheEvilPenguin
“不,这不是真的 - 你可以使用自定义监听器以任何想要的方式报告它们。也就是说,在单元测试的情况下非常有用。我同意默认行为是显示消息,但这绝对不是固定的行为。” - Alexei Levenkov
@AlexeiLevenkov:说得好,我修改了答案,使其更加正确;尽管现在感觉有点“傻”。(默认情况下不是这样吗?显然,因此合理要求以某种方式进行更改)。 - Arafangion

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接