BT

最新技術を追い求めるデベロッパのための情報コミュニティ

寄稿

Topics

地域を選ぶ

InfoQ ホームページ ニュース エラー処理、ログ、テスト機能を改善したElixir 1.7

エラー処理、ログ、テスト機能を改善したElixir 1.7

原文(投稿日:2018/08/06)へのリンク

Elixir 1.7が重視するのは、日常作業の品質の向上だ – 作者のJosé Valim氏は、このように記している。その中には、スタックトレースを取得するための新たな__STACKTRACE__構造、Erlangの新しい:loggerモジュールへの統合、ユニットテストライブラリExUnitの改良、ドキュメント内のメタデータのサポートなどが含まれる。

Elixir 1.7では例外システムが改善され、ArgumentErrorArithmeticErrorKeyError例外の生成によって、これまでよりも詳細な診断情報が提供されるようになった他、従来のSystem.stacktrace/0に代えてスタックトレース取得に使用可能な__STACKTRACE__構造が新たに追加された。

try do
  ... something that may fail ...
rescue
  exception ->
    log(exception, __STACKTRACE__)
    reraise(exception, __STACKTRACE__)
end

__STACKTRACE__は静的にスコープされている(lexically scoped)ので、System.stacktrace/0のように副作用に依存していない。Valim氏によると、これによってtryブロックの終了後にスタックトレースを追跡する必要がなくなるため、将来のElixirリリースでのパフォーマンス向上が期待できる。

Elixir Loggerモジュールは、Erlang/OPT 21で利用可能なErlangの:loggerにプラグインされることで、次のように豊富なメタデータを完全に活用できるようになった。

  • :crash_reason – throw/error/exitの理由コードを第1引数、スタックトレースを第2引数とする、2要素のタプル。throwは常に構造{:nocatch, term}を持つが、errorは常にExceptionで、exitは他のケースをカバーする。

  • :initial_call – プロセスを起動する最初のコール。

  • :registered_name – atomとして登録されるプロセス名。

さらに、debuginfoなどのLoggerマクロは、そのメッセージが実際にログに記録されない限り評価されなくなった。また、新たに用意された:compile_time_purge_matchingオプションによる、コンパイル時のメタデータに基づくログエントリのフィルタリングが可能になった。例えば、アプリケーション:foo:infoより低いレベルのログ呼び出しと、Bar.foo/3からのログ呼び出しを無視するには、Loggerを次のように設定する。

config :logger,
  compile_time_purge_matching: [
    [application: :foo, level_lower_than: :info],
    [module: Bar, function: "foo/3"]
  ]

前述のように、ElixirのユニットテストライブラリであるExUnitも改善され、assertマクロがより詳細な情報を提供するようになった。例えば、 assert some_function(expr1, var2)文が失敗した場合、some_functionへの引数値が出力されるので、テストを再実行して値を検査する必要がなくなる。

最後に、Elixir 1.7では、次の例のように、ドキュメントにメタデータを注釈することも可能になった。

@moduledoc "A brand new module"
@moduledoc authors: ["Jane", "Mary"], since: "1.4.0"

Elixir 1.7のExDocツールでは、非推奨のモジュールや関数、コールバック、型の使用にフラグを立てたり、特定の機能がいつ導入されたかを示すために、これらのメタデータを活用することができる。

Elixir 1.7の変更点に関する詳細については、公式のリリースノートを必ず参照して頂きたい。

 
 

この記事を評価

採用ステージ
スタイル
 
 

この記事に星をつける

おすすめ度
スタイル

BT