异常显示格式化 - Spectre 控制台系列
在构建 .NET 控制台应用程序时,您经常需要以对开发人员和用户都合理的方式处理异常。 普通的控制台输出会让异常看起来像一长串无法阅读的数据--尤其是在处理堆栈跟踪和反射繁重的库时。 在"异常显示格式化 - Spectre Console 系列"视频中,Tim Corey 向我们介绍了如何使用 Spectre.Console 库使异常更易于阅读、解析和理解。
在本文中,我们将探讨 Tim 如何处理异常、使用 Spectre.Console 中的命令和方法,以及在异常显示中应用不同的设置和样式。
简介:为什么需要格式异常?
在视频的开头,Tim Corey 介绍了 Spectre.Console,称其为一个库,可以帮助开发人员将普通的控制台应用程序转化为 "视觉上吸引人、内容丰富的应用程序"。在本课中,他重点介绍了如何处理异常,使异常显示更清晰、更易读。
Tim 解释说,默认情况下,当控制台应用程序抛出异常时,Console.WriteLine(ex) 的输出结果只是一堵文字墙。 它包括路径、堆栈跟踪和类型名称--所有这些都是连续的字符串。 功能性强,但不友好。
为了演示,Tim 制作了一个小例子:
try
{
throw new Exception("You forgot to give me the data.");
}
catch (Exception ex)
{
Console.WriteLine(ex);
}try
{
throw new Exception("You forgot to give me the data.");
}
catch (Exception ex)
{
Console.WriteLine(ex);
}他在终端中运行了这条命令,不出所料,输出结果一团糟。 一切融为一体。 Tim 说,很难找出重要的信息、方法或文件位置。 因此,他开始使用 Spectre.Console 异常格式来解决这个问题。
使用 AnsiConsole.WriteException - 第一步
为了改善显示效果,Tim 替换了这一行:
Console.WriteLine(ex);Console.WriteLine(ex);使用 Spectre 命令:
AnsiConsole.WriteException(ex);AnsiConsole.WriteException(ex);这一个方法调用改变了一切。
当他再次运行该应用程序时,终端中的输出已经着色。 信息清晰明了,堆栈跟踪部分的样式也有所不同。 文本更易于解析,关键值更突出。
Tim 指出,AnsiConsole 类是 Spectre.Console 中渲染样式输出的中心接入点。 WriteException() 方法专门用于处理异常并为您自动格式化异常。
他说:"这已经是一个进步了。现在,控制台会突出显示消息、文件路径和方法名称,让人一目了然。
使用 ExceptionFormats 添加格式化选项
在展示了基本示例后,Tim 又进一步添加了格式化参数,以控制异常显示的内容和缩短的方式。
他介绍了 ExceptionFormats 枚举,该枚举提供了多个选项,如 ShortenPaths、ShortenTypes、ShortenMethods 和 ShowLinks。 您可以单独使用,也可以使用管道 (|) 字符。
蒂姆编写了以下代码:
AnsiConsole.WriteException(ex, ExceptionFormats.ShortenEverything);AnsiConsole.WriteException(ex, ExceptionFormats.ShortenEverything);当他运行这条命令时,控制台输出会变得更短更简洁。
他解释说
路径已缩短--不再显示完整的目录路径,而只显示文件名,如 Program.cs。
类型已缩短--您将看到 System.IO.InvalidDataException 而不是 System.IO.InvalidDataException 。
- 缩短方法--为了清晰起见,对冗长的通用方法名称进行了删减。
本例展示了 Spectre.Console 的异常格式化选项如何在不丢失基本信息的情况下使结果更加紧凑。
Tim 强调,第一个版本(完整路径和命名空间)包含 "大部分噪音",而这个格式化版本在您只想快速了解问题根源时更有意义。
结合多种格式,实现更多控制
蒂姆不会止步于此。 他演示了如何使用管道运算符组合多个格式化设置:
AnsiConsole.WriteException(ex, ExceptionFormats.ShortenEverything | ExceptionFormats.ShowLinks);AnsiConsole.WriteException(ex, ExceptionFormats.ShortenEverything | ExceptionFormats.ShowLinks);在3:54处,Tim 解释了 ShowLinks 选项。 这样,Spectre.Console 就能在兼容终端中呈现可点击或可悬停的文件链接。 在他的例子中,文件名 Program.cs 现在出现了下划线。 当他将鼠标悬停在该文件上时,终端会显示一个包含完整文件路径的工具提示。
他指出,这种行为取决于您的环境--在支持可点击链接的终端(如某些 bash 或 VS Code 终端)中效果更好。
通过组合格式,您可以准确决定异常输出应显示多少信息--也许您想要缩短路径但显示完整的类型名称,或者您想要完全隐藏方法细节。 Spectre.Console 可为您提供这种灵活性。
深入了解异常设置
此时,Tim 引入了一个名为 ExceptionSettings 的新对象。 这使您能够以更先进的方式自定义异常的格式和样式。
他解释说,您可以传递整个设置对象,而不是传递单个格式值:
var settings = new ExceptionSettings
{
Format = ExceptionFormats.ShortenEverything,
Style = new ExceptionStyle
{
Message = new Style(foreground: Color.Red, decoration: Decoration.SlowBlink)
}
};
AnsiConsole.WriteException(ex, settings);var settings = new ExceptionSettings
{
Format = ExceptionFormats.ShortenEverything,
Style = new ExceptionStyle
{
Message = new Style(foreground: Color.Red, decoration: Decoration.SlowBlink)
}
};
AnsiConsole.WriteException(ex, settings);在这里,Tim 配置了两个属性:
格式--规定例外信息应如何缩写。
- 风格 - 定义不同异常元素(如方法名称、路径或消息)的外观。
Spectre.Console 提供丰富的样式选项,如前景色、背景色和装饰(如下划线、闪烁、加粗等)。
Tim 指出,您还可以为异常显示的其他部分设计样式,例如参数名称、方法调用或括号,而不仅仅是消息。 这允许对异常输出在 CLI 中的外观进行非常精细的控制。
异常消息的样式
为了展示样式设计的实际效果,Tim 专门为异常的消息部分应用了一种样式。 他将信息的颜色设置为红色,并添加了缓慢闪烁的效果,使其更加突出:
Message = new Style(foreground: Color.Red, decoration: Decoration.SlowBlink)Message = new Style(foreground: Color.Red, decoration: Decoration.SlowBlink)当他运行应用程序时,"嘿,你忘了给我数据。"的消息现在在终端窗口内以红色闪烁。
Tim 指出,这有助于突出异常输出中最重要的信息--信息本身。 文本的其余部分(如文件名和行号)仍可在下面找到,但您的视线会立即被出错的地方所吸引。
他解释说:"它能真正把你的注意力吸引到最重要的事情上,也就是信息本身。 然后他们就能知道,哦,这是在 Program.cs 的 main 第 256 行"。
这展示了 Spectre.Console 如何不仅使数据可读,还增加了重点和视觉层次,帮助您更快地解释结果。
总结 Spectre 控制台系列
视频结束时,Tim 提到这是他的 Spectre.Console 系列的最后一部分--至少目前是这样。 他鼓励观众在suggestions.iamtimcorey.com上留下反馈意见或对更多主题的建议。
他指出,在整个系列中,他们涵盖了 Spectre 的一系列功能:渲染表格、处理 CLI 命令和参数、处理结构化文本,以及现在的格式化异常。
Tim 最后说,本课为开发人员提供了优雅、清晰和可视化反馈地处理异常的工具,所有这一切都在一个简单的 .NET 控制台应用程序中完成。
最后的想法
通过本攻略,Tim Corey 清晰地演示了如何使 Spectre.Console 异常更易读、信息更丰富、视觉更吸引人。 只需使用几行代码,开发人员就可以
更有效地处理异常。
使用缩短的路径和更简洁的文本对控制台输出进行格式化。
使用 ExceptionSettings 对象对格式和风格进行微调。
添加颜色和装饰,突出重要信息。
- 将文件路径显示为可点击或可悬停的链接。
这种方法不仅能改善调试,还能让基于 CLI 的应用程序看起来更精致、更专业。 通过结合 AnsiConsole.WriteException() 等强大的方法、可定制的设置和丰富的样式选项,开发人员可以构建 .NET 控制台应用程序,提供有意义、结构合理、易于解析和理解的异常输出,这与 Tim Corey 在他的出色示例中展示的完全一致。

