Error Handling
This page documents error codes and error handling patterns.
Standard Error Codes
Use the predefined error codes from NodeError.errorCodes:
// Common error codes
NodeError.errorCodes.UnsupportedNode // NODE_000
NodeError.errorCodes.MissingInputToken // NODE_001
NodeError.errorCodes.MissingOutputToken // NODE_002
NodeError.errorCodes.UnsupportedToken // NODE_003
NodeError.errorCodes.UnsupportedChain // NODE_004
NodeError.errorCodes.SwapDisabled // NODE_005
NodeError.errorCodes.InvalidAmount // NODE_006
NodeError.errorCodes.NetworkError // NODE_007
NodeError.errorCodes.Internal // NODE_008
NodeError.errorCodes.ParsingError // NODE_009
NodeError.errorCodes.RpcError // NODE_010
NodeError.errorCodes.NotFound // NODE_011
NodeError.errorCodes.DatabaseError // NODE_012
NodeError.errorCodes.InactiveNode // NODE_013
NodeError.errorCodes.NodeStateError // NODE_014
NodeError.errorCodes.ApiError // NODE_015
NodeError.errorCodes.InvalidMode // NODE_016
NodeError.errorCodes.CustomError // NODE_998
NodeError.errorCodes.Other // NODE_999
Error Handling Patterns
Pattern 1: API Error Handling
try {
const response = await fetch(url);
if (!response.ok) {
return new NodeError(
`API request failed: ${response.statusText}`,
NodeError.errorCodes.ApiError
);
}
return await response.json();
} catch (error) {
return new NodeError(
`Network error: ${error.message}`,
NodeError.errorCodes.NetworkError
);
}
Pattern 2: Validation Error Handling
if (!input.input_token) {
return new NodeError(
"Input token is required",
NodeError.errorCodes.MissingInputToken
);
}
Pattern 3: Business Logic Error Handling
if (!this.isSwapEnabled(input.input_token, input.output_token)) {
return new NodeError(
"Swap not supported for this token pair",
NodeError.errorCodes.SwapDisabled
);
}
Error Code Selection Guide
| Scenario | Error Code |
|---|---|
| Missing required input token | MissingInputToken |
| Missing required output token | MissingOutputToken |
| Token not supported | UnsupportedToken |
| Chain not supported | UnsupportedChain |
| Swap not available for pair | SwapDisabled |
| Invalid amount format | InvalidAmount |
| Network/API call failed | NetworkError |
| API returned error | ApiError |
| Transaction not found | NotFound |
| Internal processing error | Internal |
| Parsing/format error | ParsingError |
| RPC call failed | RpcError |
| Node state sync failed | NodeStateError |
Real-World Examples
Meson Error Handling
Location: ts/src/nodes/meson/common.ts
- Enriches API errors with decoded
error.code - Provides friendly messages (e.g., amount-over-limit)
- Pre-validates against
/limitsto avoid API errors
NEAR Error Handling
Location: ts/src/nodes/near/common.ts
- Sets reasonable timeouts
- Distinguishes between 400 vs. 500 responses
- Provides guidance for different error types
GasZip Error Handling
Location: ts/src/nodes/gaszip/common.ts
- Uses AbortController timeouts
- Returns structured
NodeErrorwhen request aborts - Handles capacity and limit errors gracefully
Best Practices
- Use Appropriate Error Codes: Choose the most specific error code
- Provide Clear Messages: Include helpful error messages
- Handle Errors Early: Validate inputs before expensive operations
- Don't Swallow Errors: Always return or propagate errors
- Log Errors: Log errors for debugging while returning user-friendly messages
Next Steps
- Best Practices - Development guidelines
- Troubleshooting - Common issues and solutions