ZigのError型
from Zig
E!Tという構文で error unionを表す
code:zig(js)
fn divide(a: i32, b: i32) MathError!i32 {
if (b == 0) return error.DivisionByZero;
return @divTrunc(a, b);
}
この関数は、通常はi32を返し、例外時はMathErrorを返す
エラー型を省略して !i32 とも書ける
エラー型は推論される
code:zig (js)
fn divide(a: i32, b: i32) !i32 {
if (b == 0) return error.DivisionByZero;
return @divTrunc(a, b);
}
明示しておけば網羅チェックできる
code:zig(js)
doStuff(x) catch |err| switch (err) {
error.DivisionByZero => ...,
error.NegativeValue => ...,
error.TooLarge => ...,
};
E!Tはそのままでは値を取り出せないので、tryやcatchを経由して使う
try
エラーを消さず上に伝播
code:zig(js)
// tryで伝播 → エラーは消えず呼び出し元の戻り値型に移る
const val = try divide(10, 3); // valはi32、エラーは関数の戻り値型に
catch
エラーをハンドリングして消す
code:zig(js)
// catchでハンドリング → エラーが消えてただのi32になる
const val = divide(10, 0) catch 0; // valはi32(エラー型なし)
JSと同じtry,catchというキーワードだが、意味合いがかなり異なるmrsekut.icon
エラーは型に乗る
Effect System的だmrsekut.icon
ハンドリングすると消える
code:zig(js)
fn divide(a: i32, b: i32) MathError!i32 { ... }
// tryで伝播 → エラーは消えず呼び出し元の戻り値型に移る
const val = try divide(10, 3); // valはi32、エラーは関数の戻り値型に
// catchでハンドリング → エラーが消えてただのi32になる
const val = divide(10, 0) catch 0; // valはi32(エラー型なし)
複数種類のエラーを返す場合
!Tで推論させる
code:zig(js)
fn doStuff(x: i32) !i32 {
if (x == 0) return error.DivisionByZero;
if (x < 0) return error.NegativeValue;
if (x > 100) return error.TooLarge;
return x * 2;
}
あるいは、error{}でerror setを定義する
code:zig(js)
const MyError = error{
DivisionByZero,
NegativeValue,
TooLarge,
};
fn doStuff(x: i32) MyError!i32 { ... }
https://zenn.dev/drumato/books/learn-zig-to-be-a-beginner/viewer/error-handling