🛡️ API Error Handling = User Experience
Errors happen. Error handling best practices ensure users understand what went wrong.
📝 Error Response Format
// Success Response
{
"success": true,
"data": { ... },
"message": "Operation completed successfully"
}
// Error Response
{
"success": false,
"error": {
"code": "VALIDATION_001",
"message": "Invalid input provided",
"details": [
{
"field": "email",
"message": "Email is required"
}
],
"timestamp": "2024-01-15T10:00:00Z",
"requestId": "abc-123-def-456"
}
}
// HTTP Status Codes
- 200: Success
- 201: Created
- 400: Bad Request
- 401: Unauthorized
- 403: Forbidden
- 404: Not Found
- 409: Conflict
- 422: Unprocessable Entity
- 429: Too Many Requests
- 500: Internal Server Error
🎯 Client-Side Error Handling
// Fetch with Error Handling
async function fetchData(url) {
try {
const response = await fetch(url);
if (!response.ok) {
const error = await response.json();
throw new APIError(response.status, error);
}
return await response.json();
} catch (error) {
if (error instanceof APIError) {
handleAPIError(error);
} else if (error.name === 'AbortError') {
console.log('Request aborted');
} else if (error.name === 'TimeoutError') {
console.log('Request timed out');
} else {
console.error('Unknown error:', error);
showUserError('An unexpected error occurred');
}
throw error;
}
}
// API Error Class
class APIError extends Error {
constructor(status, data) {
super(data.error.message);
this.status = status;
this.code = data.error.code;
this.details = data.error.details;
this.timestamp = data.error.timestamp;
this.requestId = data.error.requestId;
}
getUserMessage() {
return this.details
? this.details.map(d => d.message).join('; ')
: this.message;
}
}
// Global Error Handler
function handleAPIError(error) {
switch(error.status) {
case 401:
redirectToLogin();
break;
case 403:
showUserError('You do not have permission to do this');
break;
case 404:
showUserError('Resource not found');
break;
case 429:
showUserError('Too many requests. Please try again later');
break;
case 500:
showUserError('Server error. Please try again later');
break;
default:
showUserError(error.getUserMessage());
}
}
💡 Error Handling Tips
- Use consistent error format
- Include helpful error messages
- Provide error codes for debugging
- Log errors for monitoring
- Show user-friendly messages
Good error handling improves user experience and helps developers debug issues quickly.
