エラー
error は、effect として流れる型付きエラーをまとめて宣言する短縮構文である。
宣言
pub error io_err:
not_found path
denied path
invalid_path path
failed (path, str)この一行で次のものがまとめて生成される。
pub enum io_err:variant はnot_found path、denied path、invalid_path path、failed (path, str)。pub act io_err:variant と同名の operation を持ち、戻り値はnever。impl Throw io_err:type throws = '[io_err]とour e.throwを持ち、 対応する operation を発火する。impl Display io_err:既定の文字列化(手書きの impl で上書き可能)。io_err::wrap:companion module 内のヘルパー。エラー effect をresult値に閉じる。fromentry がある場合だけ生成されるuphelper。リンクした narrower エラーを、宣言したエラー型に持ち上げる。
constructor と operation は同名
variant 名は データ構築子と effect operation の両方 として使える。 文脈で必要な側が選ばれる。
my err: io_err = io_err::not_found path // 値として構築
io_err::not_found path // effect として発火fail で投げる
fail は prelude の prefix 演算子で、e.throw を透過的に呼ぶ。
pub prefix(fail) = \e -> e.throw構築したエラー値を effect として送り出すときに使う。
my missing path = fail (io_err::not_found path)missing を呼ぶと io_err::not_found が発火し、fail によってそのエラーが effect row に現れる。
名指しで捕まえる
catch の effect arm は、operation 名を直接書いてエラーを捕まえる。
my read_text_or_label path = catch read_text path:
io_err::not_found _, _ -> "(missing)"
io_err::denied _, _ -> "(denied)"
value -> valueYulang のエラー設計は 名指しで捕まえる ことを前提にしている。 型を消去した catch-all や、任意の Display 実装を runtime dispatch する仕組みはなく、anyhow 型の境界を意図的に提供していない。 各エラーは effect row の中で具体的な型を保つため、発火元と handler を型から特定できる。
wrap:値に閉じる
my read_text_safe path =
my wrapped = io_err::wrap: read_text path
case wrapped:
result::ok text -> text
result::err err -> err.showE::wrap は、引数 thunk が起こす対応エラー effect を捕まえて result _ E を返す。 E に from エントリがある場合、wrap はリンクされた narrower エラーも同時に捕まえ、生成された変換を通じて wrap する。
from による集約
次の抜粋では、parser module が parse_err と parse_json を定義済みであるとする。
pub error app_err:
file from io_err
parse from parse_errこれにより次のものが生成される。
- variant
app_err::file io_errとapp_err::parse parse_err io_errとparse_errからapp_errへの生成済み変換io_errとparse_errも同時に捕まえる拡張版app_err::wrap- narrower エラーを
app_erreffect に変換する handlerapp_err::up
my read_and_parse path =
app_err::up:
my text = read_text path // [io_err]
parse_json text // [parse_err]
// block 全体の effect は [app_err]基礎的な変換機構については Casts を、catch と effect row の全般的な話は Effects を参照。