跳至頁尾內容
Iron Academy Logo
C#應用程式
C#應用程式

其他類別

格式化例外顯示 - Spectre Console 系列

[[academy-video-youtube({"vid": "sTDcUwfzCsA", "start_time": "0", "title": "例外格式顯示 - Spectre Console 系列", "creator": "Tim Corey", "length": "8m 51s"})]]

當構建 .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。 您可以單獨使用這些選項或使用管道符 (|) 字元結合它們。

Tim 編寫了以下程式碼:

AnsiConsole.WriteException(ex, ExceptionFormats.ShortenEverything);
AnsiConsole.WriteException(ex, ExceptionFormats.ShortenEverything);

當他運行此命令時,控制台輸出變得更短、更精簡。

他解釋道:

  • 路徑被縮短 - 不顯示完整目錄路徑,只顯示文件名如 Program.cs。

  • 型別被縮短 - 不顯示如 System.IO.InvalidDataException,而是僅顯示 InvalidDataException。

  • 方法被縮短 - 長泛型方法名稱被修剪以便於理解。

該範例顯示了 Spectre.Console 的例外格式選項如何在不丟失基本資訊的情況下使結果更加緊湊。

Tim 強調說,第一個版本(完整路徑和命名空間)包含"主要是噪音",而此格式版本更有意義,當您只是快速想看到問題來源時。

結合多種格式以獲得更多控制

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 提供了這種靈活性。

深入了解 ExceptionSettings

在這一點上,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 Console 系列

隨著影片結束,Tim 提到這是他的 Spectre.Console 系列的最後一部分——至少目前是這樣。 他鼓勵觀眾在 suggestions.iamtimcorey.com 提出反饋或更多主題的建議。

他指出,在整個系列中,他們已經覆蓋了多種 Spectre 功能:渲染表格、處理 CLI 命令和參數、處理結構化文字,現在發展到格式化例外。

Tim 結尾時說這堂課給了開發者工具,讓他們能夠以清晰且具有視覺回饋的方式優雅地處理例外——這一切都在一個簡單的 .NET 控制台應用程式內完美實現。

最後的想法

藉由這次走訪,Tim Corey 清楚地展示了如何使 Spectre.Console 的例外更可讀、資訊量更大且視覺吸引。 只需幾行程式碼,開發者可以:

  • 更有效地處理例外。

  • 通過縮短路徑和更清晰的文字格式化控制台輸出。

  • 使用 ExceptionSettings 物件來微調格式和樣式。

  • 新增顏色和裝飾以突顯重要資訊。

  • 將文件路徑顯示為可點擊或可懸停的連結。

這種方法不僅改善了除錯,還使基於 CLI 的應用程式看起來精緻且專業。 藉由結合強大的方法如 AnsiConsole.WriteException()、可自訂的設置和豐富的樣式選項,開發者可以構建 .NET 控制台應用程式,提供有意義且結構良好的例外輸出,易於解析和理解——正如 Tim Corey 在他的精彩範例中所展示的。

Hero Worlddot related to 格式化例外顯示 - Spectre Console 系列
Hero Affiliate related to 格式化例外顯示 - Spectre Console 系列

分享您所愛以賺取更多報酬

您是否為使用 .NET、C#、Java、Python 或 Node.js 的開發者建立內容?將您的專業知識轉化為額外收入!

Iron 支援團隊

我們線上24小時,每週5天。
聊天
電子郵件
給我打電話