LINQPad:Assert() 打印 "Fail:" 并继续而不是中断
LINQPad: Assert() prints "Fail:" and continues instead of breaking
在 LINQPad 中,System.Diagnostics
命名空间中的 Debug.Assert()
和 Trace.Assert()
未按预期工作。
而不是中断 - 即弹出消息框或任何其他碰巧为 <trace>
配置的东西 - 他们只是打印 "Fail:" 或 "Fehler:" 到输出 window 让程序继续其快乐的方式。换句话说,不是嘈杂的、不可忽视的爆炸,只有几乎看不见的 micro-farts 散布在 "Fail:" 到文本输出中。
有什么方法可以让 Assert()
恢复到 LINQPad 下的默认行为?
或者,是否有一种简单的方法来模拟 Trace.Assert()
,以便失败导致嘈杂的爆炸(即异常、消息框等),并以行号或类似的?
我的单元测试基于 Trace.Assert()
,如果函数不能在失败点中断程序,那么它们就完全没用了。
在 Visual Studio 中一切正常,但在 LINQPad 中不正常。我没有摆弄任何 system-wide 设置,但我确实在某个时间点安装了 Mono。我仔细梳理了 LINQPad 中的所有设置,但无济于事。 LINQPad 版本为 4.57.02 (non-free),运行 Windows 7 Pro(德语)和 Windows 8.1 Pro(英语)。
我用谷歌搜索了一下,但我唯一能找到的是 Stack Overflow 上的主题 Trace.Assert not breaking, neither showing the message box。它的标题看起来很有前途,但其中的答案却并非如此。
P.S.: 我试着通过添加
来模拟
class Trace
{
public static void Assert (bool condition)
{
if (!condition)
throw new Exception("FAIL!");
}
}
到 LINQ 脚本并在 throw
语句上设置断点。单击 LINQPad 调试器中的相关调用堆栈条目会将我带到相关的源代码行,这样就可以了。但是,我找不到与 FoxPro 的 SET DEBUG ON
等效的方法来直接从源代码调用调试器,而不必在 throw
...
上设置断点
要回答问题的后半部分,即如何在抛出异常时让 LINQPad 调试器中断,答案是单击工具栏上的任一 'Bug' 图标。
单击异常未处理时中断(红色错误)可在抛出未处理的异常时中断查询。
单击抛出异常时中断(蓝色错误)使您的查询在抛出异常时中断,无论它是否被处理。
您可以通过右键单击并选择设置为默认值,让 LINQPad 将任一设置设为默认值。 (这样做会强制调试器始终附加到您的查询,这会产生很小的性能成本。)
至于为什么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);
}
}
然后,要启用,请按如下方式编写您的查询:
NoisyTracer.Install();
Debug.Assert (false);
在 LINQPad 中,System.Diagnostics
命名空间中的 Debug.Assert()
和 Trace.Assert()
未按预期工作。
而不是中断 - 即弹出消息框或任何其他碰巧为 <trace>
配置的东西 - 他们只是打印 "Fail:" 或 "Fehler:" 到输出 window 让程序继续其快乐的方式。换句话说,不是嘈杂的、不可忽视的爆炸,只有几乎看不见的 micro-farts 散布在 "Fail:" 到文本输出中。
有什么方法可以让 Assert()
恢复到 LINQPad 下的默认行为?
或者,是否有一种简单的方法来模拟 Trace.Assert()
,以便失败导致嘈杂的爆炸(即异常、消息框等),并以行号或类似的?
我的单元测试基于 Trace.Assert()
,如果函数不能在失败点中断程序,那么它们就完全没用了。
在 Visual Studio 中一切正常,但在 LINQPad 中不正常。我没有摆弄任何 system-wide 设置,但我确实在某个时间点安装了 Mono。我仔细梳理了 LINQPad 中的所有设置,但无济于事。 LINQPad 版本为 4.57.02 (non-free),运行 Windows 7 Pro(德语)和 Windows 8.1 Pro(英语)。
我用谷歌搜索了一下,但我唯一能找到的是 Stack Overflow 上的主题 Trace.Assert not breaking, neither showing the message box。它的标题看起来很有前途,但其中的答案却并非如此。
P.S.: 我试着通过添加
来模拟class Trace
{
public static void Assert (bool condition)
{
if (!condition)
throw new Exception("FAIL!");
}
}
到 LINQ 脚本并在 throw
语句上设置断点。单击 LINQPad 调试器中的相关调用堆栈条目会将我带到相关的源代码行,这样就可以了。但是,我找不到与 FoxPro 的 SET DEBUG ON
等效的方法来直接从源代码调用调试器,而不必在 throw
...
要回答问题的后半部分,即如何在抛出异常时让 LINQPad 调试器中断,答案是单击工具栏上的任一 'Bug' 图标。
单击异常未处理时中断(红色错误)可在抛出未处理的异常时中断查询。
单击抛出异常时中断(蓝色错误)使您的查询在抛出异常时中断,无论它是否被处理。
您可以通过右键单击并选择设置为默认值,让 LINQPad 将任一设置设为默认值。 (这样做会强制调试器始终附加到您的查询,这会产生很小的性能成本。)
至于为什么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);
}
}
然后,要启用,请按如下方式编写您的查询:
NoisyTracer.Install();
Debug.Assert (false);