格式化異常顯示 - Spectre Console系列
在建構.NET主控台應用程式時,您常常必須以對開發者和使用者來說合理的方式處理例外狀況。 簡單的主控台輸出可能會使例外狀況看起來像是一長串難以閱讀的資料,特別是在處理堆疊追蹤和反射重庫時。 在他的影片"Formatting Exception Display - Spectre Console Series"中,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 指出這幫助強調例外輸出中最重要的信息——即訊息本身。 其餘文字(如檔案名稱和行號)仍然在下面可用,但您的視線立即被吸引到發生錯誤的地方。
他解釋道,"這確實會將您的視線吸引到最重要的東西上,即訊息本身。 然後他們可以搞清楚,哦,它在main中於Program.cs的第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在他出色的範例中所展示的那樣。
