導入:なぜエラーメッセージの「見た目」が重要なのか
開発中、コンソールに流れる無機質なエラーログに悩まされたことはありませんか?特に複雑な構造を持つエラー情報が一行で出力されると、原因の特定に時間がかかります。prettyprinterライブラリは、エラーメッセージを構造化し、インデントや色付けを行うことで、「どこで何が起きたか」を一目で理解可能にします。これは単なる装飾ではなく、チームのDX(開発者体験)を大きく底上げする重要な技術です。
基礎知識:prettyprinterの仕組み
prettyprinterは、文字列を直接結合するのではなく、Docという中間データ構造を構築するライブラリです。このDocをレンダラーに渡すことで、画面幅に応じた自動改行や、可読性の高いレイアウトが自動的に生成されます。エラー処理においては、このDocを適切に組み立てることで、階層的なエラー情報を美しく表示できます。
実装:Prettyクラスによる構造化
エラー処理を実装する際は、独自のエラー型にPrettyクラスのインスタンスを定義するのが定石です。これにより、任意のデータ型を「どう表示するか」というロジックを型の中に閉じ込めることができます。
サンプルプログラム
以下は、Haskellにおける基本的な実装例です。このコードを実行するには、cabalまたはstackで`prettyprinter`パッケージをインストールしてください。
import Prettyprinter
import Prettyprinter.Render.Terminal
— 独自のエラー型定義
data MyError = FileError String | ParseError Int String
— Prettyクラスのインスタンス化
instance Pretty MyError where
pretty (FileError path) =
vsep [ annotate (color Red) (pretty “エラー発生!”)
, indent 2 (pretty “ファイルが見つかりません: ” <> pretty path)
]
pretty (ParseError line msg) =
vsep [ annotate (color Yellow) (pretty “解析エラー:”)
, indent 2 (pretty “行数: ” <> pretty line)
, indent 2 (pretty “詳細: ” <> pretty msg)
]
main :: IO ()
main = do
— エラーメッセージをレンダリングして出力
let err = ParseError 42 “予期しないトークンです”
putDoc (pretty err <> line)
応用・注意点:現場で役立つテクニック
1. 階層構造の活用: 複雑なエラーの場合は、`vsep`(垂直配置)や`nest`(インデント)を組み合わせることで、ツリー構造のように見せることができます。
2. 色の使い分け: 色の使いすぎはかえって視認性を下げます。警告は黄色、致命的なエラーは赤など、ルールを決めて利用しましょう。
3. レンダリング先の選定: ログファイルに出力する場合は、`annotate`による色付け情報がエスケープシーケンスとして残ってしまう場合があります。その際は、色なしのレンダラー(`putDoc`の代わりに`renderString`等)を使うなど、出力先に応じた切り替えを行うと、より堅牢なシステムになります。
エラーメッセージは、未来の自分やチームメンバーへの「手紙」です。ぜひprettyprinterを活用して、親切なコードベースを目指してください!

コメント