Error Handling
Proper error handling makes your agents reliable and helps users understand what went wrong.
Return Values
Success
Return the data directly:
js
return {
temperature: 72,
condition: 'Sunny',
city: 'London',
};Error
Return an error object:
js
return {
error: true,
message: 'City not found',
};Requires Authentication
For OAuth agents when not connected:
js
return {
error: true,
message: 'Please connect your account first',
requiresAuth: true,
};Error Types
Validation Errors
Check input parameters:
js
async function handler(input, context) {
const { city } = input;
if (!city) {
return { error: true, message: 'City is required' };
}
if (typeof city !== 'string') {
return { error: true, message: 'City must be a string' };
}
// Continue...
}Missing Secrets
Check for required secrets:
js
const apiKey = context.secrets.API_KEY;
if (!apiKey) {
return {
error: true,
message: 'API key not configured. Please add your API key in plugin settings.'
};
}API Errors
Handle HTTP errors:
js
const response = await context.fetch(url);
if (!response.ok) {
// Try to get error details from response
let errorMessage = `Request failed with status ${response.status}`;
try {
const errorData = JSON.parse(response.body);
if (errorData.message) {
errorMessage = errorData.message;
}
} catch {
// Response wasn't JSON
}
return { error: true, message: errorMessage };
}Network Errors
Catch exceptions:
js
try {
const response = await context.fetch(url);
// ...
} catch (error) {
return {
error: true,
message: error.message || 'Network request failed'
};
}Full Pattern
js
async function handler(input, context) {
// 1. Validate input
const { action, query } = input;
if (!action) {
return { error: true, message: 'Action is required' };
}
// 2. Check OAuth (for connectors)
if (!await context.oauth.isConnected()) {
return { error: true, requiresAuth: true };
}
// 3. Check secrets (for API-key tools)
const apiKey = context.secrets.API_KEY;
if (!apiKey) {
return { error: true, message: 'API key not configured' };
}
// 4. Make request with error handling
try {
const response = await context.fetch(url);
// 5. Handle HTTP errors
if (!response.ok) {
return handleApiError(response);
}
// 6. Parse response
const data = JSON.parse(response.body);
// 7. Return success
return { success: true, data };
} catch (error) {
// 8. Handle exceptions
return {
error: true,
message: error.message || 'Request failed'
};
}
}
function handleApiError(response) {
const statusMessages = {
400: 'Invalid request',
401: 'Authentication failed',
403: 'Access denied',
404: 'Not found',
429: 'Rate limited - please try again later',
500: 'Server error',
};
const message = statusMessages[response.status] || `Error: ${response.status}`;
return { error: true, message };
}Helpful Error Messages
Bad
js
return { error: true, message: 'Error' };
return { error: true, message: 'Failed' };
return { error: true, message: response.status };Good
js
return { error: true, message: 'City "Londn" not found. Did you mean "London"?' };
return { error: true, message: 'Weather API rate limit exceeded. Try again in 1 minute.' };
return { error: true, message: 'Invalid API key. Please check your configuration.' };Error Recovery
When possible, suggest fixes:
js
if (response.status === 429) {
return {
error: true,
message: 'Rate limited. Please wait a moment before trying again.',
retryAfter: 60,
};
}
if (response.status === 401) {
return {
error: true,
message: 'Session expired. Please reconnect your account.',
requiresAuth: true,
};
}Logging
Use console.log for debugging (output may be limited):
js
try {
console.log('Making request to:', url);
const response = await context.fetch(url);
console.log('Response status:', response.status);
// ...
} catch (error) {
console.error('Request failed:', error.message);
throw error;
}Testing Errors
Test your error handling:
- Missing required parameters
- Invalid parameter types
- Missing secrets
- API returning errors (4xx, 5xx)
- Network timeouts
- Invalid JSON responses
- OAuth not connected