Skip to content

Error Handling

Every module in viem exports an accompanying error type which you can use to strongly type your catch statements.

These types come in the form of <Module>ErrorType. For example, the getBlockNumber action exports a GetBlockNumberErrorType type.

Unfortunately, TypeScript doesn't have an abstraction for typed exceptions, so the most pragmatic & vanilla approach would be to explicitly cast error types in the catch statement.

example.ts
import { type GetBlockNumberErrorType } from 'viem'
import { client } from './client'
 
try {
  const blockNumber = await client.getBlockNumber()
} catch (e) {
  const error = e as GetBlockNumberErrorType
  error.
name: "Error" | "ChainDisconnectedError" | "HttpRequestError" | "InternalRpcError" | "InvalidInputRpcError" | "InvalidParamsRpcError" | "InvalidRequestRpcError" | "JsonRpcVersionUnsupportedError" | ... 16 more ... | "WebSocketRequestError"
name
if (error.name === 'InternalRpcError') error.
code: -32603
code
if (error.name === 'HttpRequestError') { error.
HttpRequestError.headers?: Headers | undefined
headers
error.
HttpRequestError.status?: number | undefined
status
} }