LINQPad:Assert()打印"失败:"并继续而不是破坏

Dar*_*zka 3 c# linqpad

在LINQPad,Debug.Assert()Trace.Assert()System.Diagnostics命名空间不会达到预期效果.

而不是破坏 - 即弹出一个消息框或其他恰好配置的东西<trace>- 它们只是将"失败:"或"Fehler:"打印到输出窗口,让程序以其快乐的方式继续.换句话说,除了嘈杂,不可忽视的爆炸之外,只有近乎看不见的微屁,将"失败:"散布在文本输出中.

有没有办法Assert()恢复到LINQPad下的默认行为?

或者,是否有一种简单的Trace.Assert()模拟方法,以便失败导致嘈杂的爆炸(例外,消息框,无论如何),故障的来源以行号或类似的形式确定?

我的单元测试是基于的Trace.Assert(),如果函数在失败时不能破坏程序,它们就完全没用了.

在Visual Studio中,一切正常但在LINQPad中没有.我没有摆弄任何系统范围的设置,但我确实在某个时间点安装了Mono.我在LINQPad的所有设置中使用精细的梳子,但无济于事.LINQPad版本为4.57.02(非免费),在Windows 7 Pro(德语)和Windows 8.1 Pro(英语)上运行.

我用google搜索高,宽,但我唯一能找到的是Trace.Assert没有破坏的主题,也没有在Stack Overflow上显示消息框.它的标题看起来很有希望,但其中的答案却没有.

PS:我试着通过添加进行模拟

class Trace
{
    public static void Assert (bool condition)
    {
        if (!condition)
            throw new Exception("FAIL!");
    }
}
Run Code Online (Sandbox Code Playgroud)

到LINQ脚本并在throw语句上设置断点.单击LINQPad调试器中的相关调用堆栈条目将我带到相关的源代码行,因此这种方法很有效.但是,我无法找到与FoxPro SET DEBUG ON直接从源代码调用调试器的等价物,而不必在throw... 上设置断点.

Joe*_*ari 9

要回答问题的后半部分,即如何在抛出异常时让LINQPad调试器中断,答案是单击工具栏上的"Bug"图标之一.

异常未处理时单击" 中断"(红色错误),以便在抛出未处理的异常时使查询中断.

抛出异常时单击" 中断"(蓝色错误),以便在抛出异常时使查询中断,无论是否处理异常.

您可以让LINQPad通过右键单击并选择Set as default设置默认值.(这样做会强制调试器始终附加到您的查询,这会导致性能成本很低.)

至于为什么Debug.Assert(false)不显示对话框,这是因为LINQPad中尚未实现此行为.通过将以下代码添加到My Extensions,您可以轻松地将其实现为扩展:

public class NoisyTracer : TextWriterTraceListener
{
    public static void Install()
    {
        Trace.Listeners.Clear();
        Trace.Listeners.Add (new NoisyTracer (Console.Out));
    }

    public NoisyTracer (TextWriter writer) : base (writer) { }

    public override void Fail (string message, string detailMessage)
    {
        base.Fail (message, detailMessage);
        throw new Exception ("Trace failure: " + message);
    }
}
Run Code Online (Sandbox Code Playgroud)

然后,要启用,请按如下方式编写查询:

NoisyTracer.Install();
Debug.Assert (false);
Run Code Online (Sandbox Code Playgroud)