如何阻止 Debug.Assert(...) 显示模式对话框

问题描述 投票:0回答:4

我有几个使用

Debug.Assert(...)
的库。我认为
Debug.Assert(...)
很好,我仍然希望它们执行,但我不希望它们阻止我的应用程序的执行。理想情况下,我只希望将它们记录在某个地方。

鉴于我无法更改库的代码(并且我仍然想在调试中编译并运行断言),如何防止

Debug.Assert(...)
显示模式对话框?

此外,我想确保主程序在发生

Assert
时继续运行(与“忽略”按钮的行为相同)。

谢谢!

c# .net visual-studio c#-4.0 assert
4个回答
33
投票

我不会推荐它。问题是

Debug.Assert
仅当代码中存在错误时才应该被解雇 。如果您只是忽略它们或不修复它们,那么您就是在伤害用户。另一方面,如果您针对那些 不是
 的错误而解雇 
Debug.Assert,那么您也会对用户造成伤害(通过减少 Debug.Assert 的影响)。

话虽如此,您

可以禁用它。您需要做的第一件事是从 Debug.Listeners 集合中删除默认侦听器:

Debug.Listeners.Clear();

然后,添加您自己的:

Debug.Listeners.Add(new MyTraceListener());

您需要创建一个继承自

TraceListener的类:

class MyTraceListener : TraceListener { // ... public override void Fail(string msg, string detailedMsg) { // log the message (don't display a MessageBox) } }

重要的方法是

TraceListener.Fail方法,在DefaultTraceListener

的实现中就是显示消息框的。


33
投票
没有必要

Debug.Listeners.Clear()



只需添加到您的

.config

<system.diagnostics> <assert assertuienabled="false"/> </system.diagnostics>
    

5
投票
Codekas 的答案是正确的,如果你想用一把非常大的锤子敲击东西。 您可以使用应用程序配置文件中的

<assert>

 元素将assertuienabled 属性设置为 false,并可选择为要写入的断言提供日志文件。  那么你就不必编写自己的监听器了。

您可以在其

MSDN 页面阅读有关断言元素的更多信息。


0
投票
也许有人想显示一个对话框,但在最新版本的 DotNet 中却不想显示

这是一个完整的示例,您可以自行启用或禁用它

// Created By [email protected] at 2024-11-17 17:23:56+0800 using System.Diagnostics; Application.SetCompatibleTextRenderingDefault(false); Application.EnableVisualStyles(); Application.SetHighDpiMode(HighDpiMode.SystemAware); Trace.Listeners.Clear(); Trace.Listeners.Add(new MyTraceListener()); var form = new Form(); form.ClientSize = new Size(800, 450); var button = new Button { Dock = DockStyle.Fill, Text = "CLICK ME" }; button.Click += delegate { Trace.Assert("Hello".StartsWith("World"), "Hello Should Starts With World!"); }; form.Controls.Add(button); Application.Run(form); internal class MyTraceListener : DefaultTraceListener { public override void Fail(string? message, string? detailMessage) { var stackTrace = new StackTrace(true).ToString(); var combinedMessage = $"{message}\n{detailMessage}".Trim(); var finalMessage = $"{combinedMessage}\n{stackTrace}".Trim(); var form = new Form(); form.StartPosition = FormStartPosition.CenterScreen; form.ClientSize = new Size(800, 450); form.Text = "Assertion Failed!"; form.Icon = SystemIcons.Error; var label = new Label { Dock = DockStyle.Fill }; label.Text = finalMessage; form.Controls.Add(label); form.ShowDialog(); } }
    
© www.soinside.com 2019 - 2024. All rights reserved.