Error Handling in oRPC Clients
This guide explains how to handle type-safe errors in oRPC clients using type-safe error handling. Both server-side and client-side clients are supported.
Using safe
and isDefinedError
ts
import { isDefinedError, safe } from '@orpc/client'
const doSomething = os
.input(z.object({ id: z.string() }))
.errors({
RATE_LIMIT_EXCEEDED: {
data: z.object({ retryAfter: z.number() })
}
})
.handler(async ({ input, errors }) => {
throw errors.RATE_LIMIT_EXCEEDED({ data: { retryAfter: 1000 } })
return { id: input.id }
})
.callable()
const [error, data, isDefined] = await safe(doSomething({ id: '123' }))
// or const { error, data, isDefined } = await safe(doSomething({ id: '123' }))
if (isDefinedError(error)) { // or isDefined
// handle known error
console.log(error.data.retryAfter)
}
else if (error) {
// handle unknown error
}
else {
// handle success
console.log(data)
}
INFO
safe
works liketry/catch
, but can infer error types.safe
supports both tuple[error, data, isDefined]
and object{ error, data, isDefined }
styles.isDefinedError
checks if an error originates from.errors
.isDefined
can replaceisDefinedError