- Spec files
npm-axios
Describes: pkg:npm/axios@1.6.x
- Description
- Promise based HTTP client for the browser and node.js
- Author
- tessl
- Last updated
error-handling.md docs/
1# Error Handling23Comprehensive error handling system with detailed error information, type-safe error checking, and specific error codes for different failure scenarios.45## Capabilities67### AxiosError Class89Main error class for axios-specific errors with detailed diagnostic information.1011```typescript { .api }12class AxiosError<T = unknown, D = any> extends Error {13/**14* Creates new AxiosError15* @param message - Error message16* @param code - Error code17* @param config - Request configuration18* @param request - Request object19* @param response - Response object (if received)20*/21constructor(22message?: string,23code?: string,24config?: InternalAxiosRequestConfig<D>,25request?: any,26response?: AxiosResponse<T, D>27);2829/** Request configuration that caused the error */30config?: InternalAxiosRequestConfig<D>;3132/** Error code identifying the error type */33code?: string;3435/** Request object (platform-specific) */36request?: any;3738/** Response object (if server responded) */39response?: AxiosResponse<T, D>;4041/** Always true for AxiosError instances */42isAxiosError: boolean;4344/** HTTP status code from response */45status?: number;4647/** Original error that caused this error */48cause?: Error;4950/** Convert error to JSON object */51toJSON(): object;5253/**54* Create AxiosError from existing error55* @param error - Original error56* @param code - Error code57* @param config - Request configuration58* @param request - Request object59* @param response - Response object60* @param customProps - Additional properties61* @returns New AxiosError instance62*/63static from<T = unknown, D = any>(64error: Error | unknown,65code?: string,66config?: InternalAxiosRequestConfig<D>,67request?: any,68response?: AxiosResponse<T, D>,69customProps?: object70): AxiosError<T, D>;71}72```7374**Usage Examples:**7576```typescript77import axios, { AxiosError } from "axios";7879try {80const response = await axios.get("https://api.example.com/users/999");81} catch (error) {82if (error instanceof AxiosError) {83console.log("Error message:", error.message);84console.log("Error code:", error.code);85console.log("Status code:", error.status);8687if (error.response) {88// Server responded with error status89console.log("Response data:", error.response.data);90console.log("Status:", error.response.status);91console.log("Headers:", error.response.headers);92} else if (error.request) {93// Request was made but no response received94console.log("No response received:", error.request);95} else {96// Something else happened97console.log("Request setup error:", error.message);98}99100// Access request config101console.log("Request URL:", error.config?.url);102console.log("Request method:", error.config?.method);103}104}105```106107### Error Type Checking108109Type-safe functions to identify axios errors and cancellations.110111```typescript { .api }112/**113* Check if error is an axios error114* @param payload - Value to check115* @returns Type predicate indicating if value is AxiosError116*/117function isAxiosError<T = any, D = any>(payload: any): payload is AxiosError<T, D>;118119/**120* Check if error is a cancellation121* @param value - Value to check122* @returns Type predicate indicating if value is Cancel123*/124function isCancel(value: any): value is Cancel;125```126127**Usage Examples:**128129```typescript130import axios, { isAxiosError, isCancel } from "axios";131132try {133const response = await axios.get("https://api.example.com/data");134} catch (error) {135if (isAxiosError(error)) {136// TypeScript knows this is an AxiosError137console.log("Axios error occurred:", error.message);138139if (error.response?.status === 404) {140console.log("Resource not found");141} else if (error.response?.status === 401) {142console.log("Unauthorized - redirecting to login");143redirectToLogin();144} else if (error.code === "ECONNABORTED") {145console.log("Request timeout");146}147} else if (isCancel(error)) {148console.log("Request was cancelled:", error.message);149} else {150// Regular Error or other type151console.log("Non-axios error:", error);152}153}154```155156### Error Codes157158Standard error codes provided by AxiosError for different failure scenarios.159160```typescript { .api }161// Network and connection errors162static readonly ERR_NETWORK = "ERR_NETWORK";163static readonly ECONNABORTED = "ECONNABORTED";164static readonly ETIMEDOUT = "ETIMEDOUT";165166// Request configuration errors167static readonly ERR_BAD_OPTION_VALUE = "ERR_BAD_OPTION_VALUE";168static readonly ERR_BAD_OPTION = "ERR_BAD_OPTION";169static readonly ERR_INVALID_URL = "ERR_INVALID_URL";170171// Response errors172static readonly ERR_BAD_RESPONSE = "ERR_BAD_RESPONSE";173static readonly ERR_BAD_REQUEST = "ERR_BAD_REQUEST";174175// Redirect errors176static readonly ERR_FR_TOO_MANY_REDIRECTS = "ERR_FR_TOO_MANY_REDIRECTS";177178// Feature support errors179static readonly ERR_NOT_SUPPORT = "ERR_NOT_SUPPORT";180static readonly ERR_DEPRECATED = "ERR_DEPRECATED";181182// Cancellation errors183static readonly ERR_CANCELED = "ERR_CANCELED";184```185186**Usage Examples:**187188```typescript189import axios, { AxiosError } from "axios";190191try {192const response = await axios.get("https://api.example.com/data", {193timeout: 5000194});195} catch (error) {196if (error instanceof AxiosError) {197switch (error.code) {198case AxiosError.ETIMEDOUT:199case AxiosError.ECONNABORTED:200console.log("Request timed out - retrying...");201// Implement retry logic202break;203204case AxiosError.ERR_NETWORK:205console.log("Network error - check connection");206showNetworkErrorMessage();207break;208209case AxiosError.ERR_BAD_REQUEST:210console.log("Bad request - check request parameters");211break;212213case AxiosError.ERR_FR_TOO_MANY_REDIRECTS:214console.log("Too many redirects");215break;216217case AxiosError.ERR_CANCELED:218console.log("Request was cancelled");219break;220221default:222console.log("Unknown error:", error.code);223}224}225}226```227228### CanceledError Class229230Specific error class for cancelled requests.231232```typescript { .api }233class CanceledError<T> extends AxiosError<T> {234// Inherits all properties and methods from AxiosError235}236```237238**Usage Examples:**239240```typescript241import axios, { CanceledError } from "axios";242243const controller = new AbortController();244245try {246const response = await axios.get("https://api.example.com/data", {247signal: controller.signal248});249} catch (error) {250if (error instanceof CanceledError) {251console.log("Request was cancelled specifically");252} else {253console.log("Other error occurred");254}255}256257// Cancel the request258controller.abort();259```260261### Error Response Handling262263Handle different types of error responses from servers.264265**Usage Examples:**266267```typescript268import axios, { AxiosError } from "axios";269270async function handleApiCall() {271try {272const response = await axios.post("https://api.example.com/users", {273name: "John",274email: "invalid-email" // Invalid data275});276return response.data;277} catch (error) {278if (error instanceof AxiosError && error.response) {279const { status, data } = error.response;280281switch (status) {282case 400:283// Bad Request - validation errors284console.log("Validation errors:", data.errors);285displayValidationErrors(data.errors);286break;287288case 401:289// Unauthorized290console.log("Authentication required");291redirectToLogin();292break;293294case 403:295// Forbidden296console.log("Access denied");297showAccessDeniedMessage();298break;299300case 404:301// Not Found302console.log("Resource not found");303showNotFoundMessage();304break;305306case 409:307// Conflict308console.log("Resource conflict:", data.message);309handleConflict(data);310break;311312case 422:313// Unprocessable Entity314console.log("Data validation failed:", data.errors);315displayFormErrors(data.errors);316break;317318case 429:319// Too Many Requests320console.log("Rate limited. Retry after:", error.response.headers["retry-after"]);321scheduleRetry(error.response.headers["retry-after"]);322break;323324case 500:325// Internal Server Error326console.log("Server error occurred");327showServerErrorMessage();328break;329330case 503:331// Service Unavailable332console.log("Service temporarily unavailable");333showMaintenanceMessage();334break;335336default:337console.log(`Unexpected error: ${status}`);338showGenericErrorMessage();339}340} else if (error instanceof AxiosError && error.request) {341// Network error - no response received342console.log("Network error - no response received");343showNetworkErrorMessage();344} else {345// Other error346console.log("Unexpected error:", error);347showGenericErrorMessage();348}349350throw error; // Re-throw if needed351}352}353```354355### Custom Error Handling356357Create custom error handling patterns and error recovery mechanisms.358359**Usage Examples:**360361```typescript362import axios, { AxiosError, AxiosResponse } from "axios";363364// Retry function with exponential backoff365async function retryRequest<T>(366requestFn: () => Promise<AxiosResponse<T>>,367maxRetries: number = 3,368baseDelay: number = 1000369): Promise<AxiosResponse<T>> {370let lastError: AxiosError;371372for (let attempt = 0; attempt <= maxRetries; attempt++) {373try {374return await requestFn();375} catch (error) {376lastError = error as AxiosError;377378// Don't retry client errors (4xx) except 429379if (lastError.response?.status && lastError.response.status >= 400 && lastError.response.status < 500 && lastError.response.status !== 429) {380throw lastError;381}382383// Don't retry if no more attempts384if (attempt === maxRetries) {385throw lastError;386}387388// Wait before retrying (exponential backoff)389const delay = baseDelay * Math.pow(2, attempt);390await new Promise(resolve => setTimeout(resolve, delay));391392console.log(`Retrying request (attempt ${attempt + 2}/${maxRetries + 1})...`);393}394}395396throw lastError!;397}398399// Usage400const response = await retryRequest(401() => axios.get("https://api.example.com/unreliable-endpoint"),4023, // Max 3 retries4031000 // Start with 1 second delay404);405406// Error boundary function407async function safeApiCall<T>(408apiCall: () => Promise<AxiosResponse<T>>,409fallbackValue?: T410): Promise<{ data: T | undefined; error: AxiosError | null }> {411try {412const response = await apiCall();413return { data: response.data, error: null };414} catch (error) {415if (error instanceof AxiosError) {416console.log("API call failed:", error.message);417return { data: fallbackValue, error };418}419throw error; // Re-throw non-axios errors420}421}422423// Usage424const { data, error } = await safeApiCall(425() => axios.get<User[]>("https://api.example.com/users"),426[] // Fallback to empty array427);428429if (error) {430console.log("Using fallback data due to error:", error.message);431}432console.log("Users:", data);433```