例外表示のフォーマット - Spectre Console シリーズ
.NETコンソールアプリケーションを構築する場合、開発者とユーザーの両方が納得できる方法で例外を処理しなければならないことがよくあります。 特に、スタックトレースやリフレクションを多用するライブラリを扱う場合、プレーンなコンソール出力では、例外が長くて読みにくいデータ列のように見えることがあります。 Formatting Exception Display - Spectre Console Series" というビデオでは、Tim Corey 氏が Spectre.Console ライブラリを使用して例外を読みやすく、解析しやすく、理解しやすくする方法を説明しています。
この記事では、Tim がどのように例外を処理し、Spectre.Console のコマンドやメソッドを使用し、例外表示にさまざまな設定やスタイルを適用しているかを探ります。
はじめに:なぜ例外をフォーマットするのか
ビデオの冒頭で、Tim Corey 氏は Spectre.Console を紹介し、開発者がプレーンなコンソールアプリを "視覚的に魅力的で情報量の多いアプリケーション" に変えるのに役立つライブラリだと説明します。この特別なレッスンでは、例外の表示をよりわかりやすく、読みやすくする処理方法に焦点を当てている。
ティムは、デフォルトでは、コンソールアプリで例外がスローされると、Console.WriteLine(ex)から得られる出力は単なるテキストの壁であると説明します。 パス、スタックトレース、型名など、すべて連続した文字列として翻訳します。 機能的ですが、フレンドリーではありません。
デモンストレーションのために、ティムは小さな例を作成します:
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);
}彼はターミナルでこのコマンドを実行した。 すべてが調和する ティムは、メッセージ、メソッド、ファイルの場所など、何が重要なのかを見極めるのは難しいと指摘する。 そこで彼は、Spectre.Consoleの例外フォーマットを使って、この問題を解決することにしました。
AnsiConsole.WriteExceptionの使用 - 最初のステップ
表示を改善するために、ティムは行を置き換えます:
Console.WriteLine(ex);Console.WriteLine(ex);Spectre コマンドを使用します:
AnsiConsole.WriteException(ex);AnsiConsole.WriteException(ex);このたった1つのメソッド呼び出しがすべてを変えます。
再びアプリを実行すると、ターミナルの出力がカラー化されている。 メッセージは明確に表示され、スタックトレースのセクションは異なるスタイルで表示されます。 テキストは解析しやすく、重要な価値は際立ちます。
Tim は、AnsiConsole クラスが、スタイル付き出力をレンダリングするための Spectre.Console の中心的なアクセスポイントとして機能することを指摘しています。 WriteException() メソッドは、例外を処理し、自動的にフォーマットするために特別に設計されています。
彼は言う、"それはすでにステップアップしている"。コンソールでは、メッセージ、ファイルパス、メソッド名がハイライトされるようになり、一目で読みやすくなりました。
ExceptionFormatsで書式設定オプションを追加する
基本的な例を示した後、Timは、例外のどの部分が表示され、どのように短縮されるかを制御する書式パラメータを追加することで、さらに一歩進めます。
彼は、ShortenPaths、ShortenTypes、ShortenMethods、ShowLinksのようないくつかのオプションを提供するExceptionFormats列挙を紹介しています。 これらを個別に使用することも、パイプ(|)文字。
Timは次のようなコードを書きます:
AnsiConsole.WriteException(ex, ExceptionFormats.ShortenEverything);AnsiConsole.WriteException(ex, ExceptionFormats.ShortenEverything);彼がこのコマンドを実行すると、コンソール出力はより短く簡潔になります。
彼は次のように説明する:
パスは短縮され、ディレクトリのフルパスが表示される代わりに、Program.csのようなファイル名のみが表示されます。
System.IO.InvalidDataException の代わりに、InvalidDataException.
- メソッドは短く - 長い一般的なメソッド名は、わかりやすくするために削られています。
この例では、Spectre.Console の例外フォーマットオプションが、重要な情報を失うことなく、結果をよりコンパクトにする方法を示しています。
ティムは、最初のバージョン(フルパスと名前空間)には"ほとんどノイズ"が含まれていることを強調しています。
複数の形式を組み合わせてより多くの制御を行う
ティムはそれだけにとどまりません。 彼は、パイプ演算子を使用して、複数の書式設定を組み合わせる方法を示します:
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は2つのプロパティを設定します:
フォーマット - 例外情報をどのように短縮するかを指定します。
- スタイル - さまざまな例外要素(メソッド名、パス、メッセージなど)の見え方を定義します。
Spectre.Consoleは、前景色、背景色、装飾(下線、点滅、太字など)などの豊富なスタイリングオプションを提供します。
Timは、メッセージだけでなく、パラメータ名、メソッド呼び出し、括弧など、例外表示の他の部分にもスタイルを設定できることを指摘しています。 これにより、CLIでの例外出力の見え方を非常に細かく制御することができます。
例外メッセージのスタイル設定
スタイリングが実際にどのように機能するかを示すために、ティムは例外のメッセージ部分に特別にスタイルを適用しています。 彼は、メッセージの色を赤に設定し、それをさらに目立たせるためにゆっくりと点滅するエフェクトを追加しました:
Message = new Style(foreground: Color.Red, decoration: Decoration.SlowBlink)Message = new Style(foreground: Color.Red, decoration: Decoration.SlowBlink)彼がアプリを実行すると、"Hey, you forgot to give me the data. "というメッセージがターミナルウィンドウ内で赤く点滅するようになりました。
ティム氏は、これによって例外出力で最も重要な情報、つまりメッセージそのものを強調することができると指摘しています。 残りのテキスト(ファイル名や行番号など)は以下で利用可能ですが、何が間違っているのかにすぐに目が行きます。
彼は次のように説明します。"メッセージそのものである最も重要なことに目を向けさせることができます。 そして、Program.csの256行目のmainにあることを理解できるようにする。"
これは、Spectre.Console がデータを読みやすくするだけでなく、強調表示や視覚的な階層を追加して、結果をすばやく解釈できるようにする方法を示しています。
Spectreコンソールシリーズをまとめる
ビデオの最後に、ティムは、これが彼のSpectre.Consoleシリーズの最終回であると述べています。 suggestions.iamtimcorey.comで、視聴者がフィードバックや他のトピックへの提案を残すことを奨励している。
シリーズを通して、テーブルのレンダリング、CLIコマンドと引数の処理、構造化テキストの操作、そして今回は例外のフォーマットなど、さまざまなSpectreの機能を取り上げてきたという。
Timは最後に、このレッスンは開発者に、明確で視覚的なフィードバックにより、例外を優雅に処理するためのツールを提供します。
最終的な考え
このウォークスルーを通して、Tim Corey 氏は、Spectre.Console の例外をより読みやすく、有益で、視覚的に魅力的なものにする方法を明確に示しています。 数行のコードを使用するだけで、開発者は次のことができます:
例外をより効果的に処理します。
コンソール出力を、短縮されたパスとすっきりとしたテキストでフォーマットします。
ExceptionSettingsオブジェクトを使用して、形式とスタイルを微調整します。
重要な情報を強調するために、色や装飾を加えてください。
- ファイルパスをクリック可能またはホバー可能なリンクとして表示します。
このアプローチは、デバッグを改善するだけでなく、CLIベースのアプリケーションを洗練されたプロフェッショナルなものにします。 AnsiConsole.WriteException()のような強力なメソッド、カスタマイズ可能な設定、豊富なスタイリングオプションを組み合わせることで、開発者は、解析と理解が容易で、意味のある、よく構造化された例外出力を提供する.NETコンソールアプリを構築することができます。

