Effect.catchTag
Effect<A, E, R>のEを処理する
つまり、型レベルで追跡しているDomain Errorを、tagで分岐して処理できる
https://effect.website/docs/error-management/expected-errors/#catchtag
例
適当なDomain Errorを用意しておく
code:ts
import { Effect, Schema } from "effect";
class HttpError extends Schema.TaggedError<HttpError>()("HttpError", {
statusCode: Schema.Number,
message: Schema.String,
}) {}
class ValidationError extends Schema.TaggedError<ValidationError>()(
"ValidationError",
{
message: Schema.String,
}
) {}
なんかエラーが起きるprogramがあったとする
擬似的にHttpErrorを起こしているが、実際は何らかの処理があって、
Effect<string, HttpError | ValidationError>を返すprogramだとする
code:ts
const program: Effect.Effect<string, HttpError | ValidationError> =
HttpError.make({
statusCode: 500,
message: "Internal server error",
});
catchTagを使ってハンドルする
programには型レベルでエラーの情報があるので、それを元に分岐して書ける
この例では、HttpErrorが来た場合の回復処理を書いている
code:ts
// recovered :: Effect<string, ValidationError, never>
const recovered = program.pipe(
Effect.catchTag("HttpError", (error) =>
Effect.gen(function* () {
yield* Effect.logWarning(HTTP ${error.statusCode}: ${error.message});
return "Recovered from HttpError";
})
)
);
programは元々HttpError | ValidationErrorという2種類のエラーがありえて、
ここで前者のみハンドルしてるので、
返り値では、後者のみが型情報に載っている