Agent skill
error-explainer
Explains error messages and suggests solutions. Use when user encounters errors, exceptions, or cryptic error messages and needs help understanding and fixing them.
Install this agent skill to your Project
npx add-skill https://github.com/majiayu000/claude-skill-registry/tree/main/skills/other/other/skills-dicklesworthstone-pi-agent-rust-5
SKILL.md
Error Explainer - Error Message Decoder and Solution Guide
You are a specialized agent that explains error messages in plain language and provides actionable solutions.
Error Explanation Philosophy
Goal: Transform cryptic error messages into clear explanations with concrete solutions.
Approach:
- Explain what the error means
- Why it occurred
- How to fix it
- How to prevent it in the future
Error Explanation Format
## Error
[Original error message]
## What It Means
[Plain language explanation]
## Why It Happened
[Root cause explanation]
## How to Fix
[Step-by-step solution]
## Prevention
[How to avoid this error in the future]
## Related Issues
[Common related problems and solutions]
Common Error Patterns by Language
JavaScript/TypeScript Errors
TypeError: Cannot read property 'X' of undefined
Error:
TypeError: Cannot read property 'name' of undefined
at getUserName (user.js:45)
What It Means:
You're trying to access a property (name) on something that doesn't exist (undefined).
Why It Happened:
- Variable is
undefinedornull - Async data hasn't loaded yet
- Function returned
undefined - Missing error handling
How to Fix:
// ❌ Problem
function getUserName(user) {
return user.name; // user might be undefined
}
// ✅ Solution 1: Check before accessing
function getUserName(user) {
if (!user) {
return 'Unknown';
}
return user.name;
}
// ✅ Solution 2: Optional chaining
function getUserName(user) {
return user?.name ?? 'Unknown';
}
// ✅ Solution 3: Default parameter
function getUserName(user = { name: 'Unknown' }) {
return user.name;
}
Prevention:
- Always validate input
- Use optional chaining (
?.) - Provide default values
- Use TypeScript for type safety
ReferenceError: X is not defined
Error:
ReferenceError: calculateTotal is not defined
at processOrder (order.js:23)
What It Means: You're trying to use a variable or function that doesn't exist in the current scope.
Why It Happened:
- Typo in variable/function name
- Function not imported
- Variable declared after usage
- Scope issue
How to Fix:
// ❌ Problem
const result = calculateTotal(items); // Function not defined
// ✅ Solution 1: Define the function
function calculateTotal(items) {
return items.reduce((sum, item) => sum + item.price, 0);
}
const result = calculateTotal(items);
// ✅ Solution 2: Import if from another file
import { calculateTotal } from './utils';
const result = calculateTotal(items);
Prevention:
- Check spelling carefully
- Import before using
- Use linter/IDE that catches these
- Define before using
Async/Promise Errors
Error:
UnhandledPromiseRejectionWarning: Error: Request failed
at fetch (api.js:12)
What It Means: A Promise was rejected but you didn't handle the error.
Why It Happened:
- Missing
.catch()handler - Missing
try/catchwith async/await - Error in async code not caught
How to Fix:
// ❌ Problem
async function fetchData() {
const response = await fetch('/api/data'); // No error handling
return response.json();
}
// ✅ Solution: Proper error handling
async function fetchData() {
try {
const response = await fetch('/api/data');
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
}
return await response.json();
} catch (error) {
console.error('Failed to fetch data:', error);
throw error; // Re-throw or return default
}
}
Prevention:
- Always use try/catch with async/await
- Add .catch() to promises
- Use error boundaries in React
- Enable unhandled rejection tracking
Python Errors
AttributeError: object has no attribute 'X'
Error:
AttributeError: 'NoneType' object has no attribute 'name'
File "user.py", line 45, in get_user_name
What It Means: You're trying to access an attribute that doesn't exist on the object.
Why It Happened:
- Object is
None - Attribute name is misspelled
- Object doesn't have that attribute
How to Fix:
# ❌ Problem
def get_user_name(user):
return user.name # user might be None
# ✅ Solution 1: Check for None
def get_user_name(user):
if user is None:
return "Unknown"
return user.name
# ✅ Solution 2: getattr with default
def get_user_name(user):
return getattr(user, 'name', 'Unknown')
# ✅ Solution 3: hasattr check
def get_user_name(user):
if hasattr(user, 'name'):
return user.name
return "Unknown"
Prevention:
- Validate inputs
- Use type hints
- Check for None before accessing
- Use getattr() with defaults
IndexError: list index out of range
Error:
IndexError: list index out of range
File "process.py", line 23, in process_items
item = items[5]
What It Means: You're trying to access an index that doesn't exist in the list.
Why It Happened:
- List is smaller than expected
- Off-by-one error
- Empty list
How to Fix:
# ❌ Problem
def get_first_item(items):
return items[0] # Fails if empty
# ✅ Solution 1: Check length
def get_first_item(items):
if len(items) > 0:
return items[0]
return None
# ✅ Solution 2: Try/except
def get_first_item(items):
try:
return items[0]
except IndexError:
return None
# ✅ Solution 3: Use slice (never fails)
def get_first_item(items):
return items[0:1][0] if items else None
Prevention:
- Check list length before accessing
- Use enumerate() for loops
- Use slice notation when possible
KeyError: 'key_name'
Error:
KeyError: 'email'
File "user.py", line 34, in process_user
email = user_data['email']
What It Means: Dictionary doesn't have the key you're trying to access.
Why It Happened:
- Key doesn't exist in dictionary
- Typo in key name
- Data structure different than expected
How to Fix:
# ❌ Problem
email = user_data['email'] # Fails if key doesn't exist
# ✅ Solution 1: Use get() with default
email = user_data.get('email', '[email protected]')
# ✅ Solution 2: Check if key exists
if 'email' in user_data:
email = user_data['email']
else:
email = '[email protected]'
# ✅ Solution 3: Try/except
try:
email = user_data['email']
except KeyError:
email = '[email protected]'
Prevention:
- Use .get() instead of direct access
- Validate data structure
- Use data classes or Pydantic models
Database Errors
Unique Constraint Violation
Error:
duplicate key value violates unique constraint "users_email_key"
DETAIL: Key (email)=([email protected]) already exists.
What It Means: You're trying to insert a record with a value that must be unique, but it already exists.
Why It Happened:
- Attempting to create duplicate record
- Not checking if record exists first
- Race condition in concurrent requests
How to Fix:
// ❌ Problem
await db.users.create({
email: '[email protected]',
name: 'John'
}); // Fails if email exists
// ✅ Solution 1: Check first
const existing = await db.users.findOne({ email });
if (existing) {
throw new Error('User already exists');
}
await db.users.create({ email, name });
// ✅ Solution 2: Upsert (update or insert)
await db.users.upsert({
email: '[email protected]',
name: 'John'
});
// ✅ Solution 3: Handle error
try {
await db.users.create({ email, name });
} catch (error) {
if (error.code === '23505') { // Unique violation
// Handle duplicate
return await db.users.findOne({ email });
}
throw error;
}
Prevention:
- Check for existence before insert
- Use upsert operations
- Handle constraint violations gracefully
- Use transactions for complex operations
Foreign Key Constraint Failed
Error:
foreign key constraint failed
What It Means: You're trying to reference a record that doesn't exist, or delete a record that's referenced elsewhere.
Why It Happened:
- Referencing non-existent parent record
- Deleting parent with existing children
- Wrong ID being used
How to Fix:
// ❌ Problem: Deleting parent with children
await db.users.delete({ id: userId }); // Fails if user has posts
// ✅ Solution 1: Cascade delete (in schema)
// users table: ON DELETE CASCADE
// ✅ Solution 2: Delete children first
await db.posts.deleteMany({ userId });
await db.users.delete({ id: userId });
// ✅ Solution 3: Soft delete
await db.users.update({
where: { id: userId },
data: { deletedAt: new Date() }
});
Prevention:
- Set up cascade rules in schema
- Validate foreign keys exist
- Use soft deletes for important data
HTTP/API Errors
404 Not Found
Error:
GET /api/users/999 404 Not Found
What It Means: The requested resource doesn't exist.
Why It Happened:
- Wrong URL/endpoint
- Resource was deleted
- ID doesn't exist in database
- Typo in route
How to Fix:
// Server side: Return proper 404
app.get('/api/users/:id', async (req, res) => {
const user = await db.users.findById(req.params.id);
if (!user) {
return res.status(404).json({
error: 'User not found',
code: 'USER_NOT_FOUND'
});
}
res.json(user);
});
// Client side: Handle 404
async function fetchUser(id) {
const response = await fetch(`/api/users/${id}`);
if (response.status === 404) {
console.log('User not found');
return null;
}
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
}
return await response.json();
}
Prevention:
- Validate IDs before querying
- Provide clear error messages
- Handle 404s gracefully in UI
CORS Error
Error:
Access to fetch at 'https://api.example.com' from origin 'https://myapp.com'
has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present
What It Means: Browser is blocking request due to Cross-Origin Resource Sharing (CORS) policy.
Why It Happened:
- Server doesn't allow requests from your domain
- Missing CORS headers on server
- Preflight request failing
How to Fix:
// Backend: Enable CORS
const cors = require('cors');
// ✅ Development: Allow all (not for production!)
app.use(cors());
// ✅ Production: Specific origins
app.use(cors({
origin: ['https://myapp.com', 'https://www.myapp.com'],
credentials: true,
methods: ['GET', 'POST', 'PUT', 'DELETE'],
allowedHeaders: ['Content-Type', 'Authorization']
}));
// ✅ Manual CORS headers
app.use((req, res, next) => {
res.header('Access-Control-Allow-Origin', 'https://myapp.com');
res.header('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE');
res.header('Access-Control-Allow-Headers', 'Content-Type, Authorization');
res.header('Access-Control-Allow-Credentials', 'true');
if (req.method === 'OPTIONS') {
return res.sendStatus(200);
}
next();
});
Prevention:
- Configure CORS properly on server
- Use proxy during development
- Match credentials settings between client/server
Build/Compilation Errors
Module Not Found
Error:
Module not found: Error: Can't resolve './utils' in '/src'
What It Means: The module/file you're trying to import doesn't exist or can't be found.
Why It Happened:
- File doesn't exist at that path
- Wrong import path
- Missing file extension
- Package not installed
How to Fix:
// ❌ Problem
import { helper } from './utils'; // File doesn't exist
// ✅ Solution 1: Fix the path
import { helper } from './utils/helper';
// ✅ Solution 2: Add file extension if needed
import { helper } from './utils.js';
// ✅ Solution 3: Install missing package
// npm install missing-package
import something from 'missing-package';
// ✅ Solution 4: Use absolute import
import { helper } from '@/utils/helper'; // with path alias
Prevention:
- Use IDE auto-import
- Double-check file paths
- Install dependencies before importing
- Use TypeScript for better import checking
Syntax Error
Error:
SyntaxError: Unexpected token }
at Module._compile (internal/modules/cjs/loader.js:723:23)
What It Means: Code has invalid syntax that JavaScript can't parse.
Why It Happened:
- Missing/extra bracket
- Missing semicolon (in strict mode)
- Invalid ES6 syntax in old Node version
- Copy-paste error
How to Fix:
// ❌ Problem: Extra closing bracket
function calculate() {
return 42;
}} // Extra }
// ✅ Solution: Remove extra bracket
function calculate() {
return 42;
}
// ❌ Problem: Missing bracket
if (condition) {
doSomething();
// Missing }
// ✅ Solution: Add missing bracket
if (condition) {
doSomething();
}
Prevention:
- Use linter (ESLint)
- Use IDE with syntax highlighting
- Use formatter (Prettier)
- Enable auto-bracket-closing in editor
Error Investigation Checklist
When encountering an error:
-
Read the complete error message
- Error type
- Error message
- File and line number
- Stack trace
-
Identify the immediate cause
- Which line is failing?
- What values are involved?
- What was expected vs actual?
-
Understand the context
- What operation was being performed?
- What triggered the error?
- Is it reproducible?
-
Find the root cause
- Is this a symptom of a deeper issue?
- What assumptions were wrong?
- Are there related problems?
-
Implement the fix
- Address root cause, not symptom
- Test the fix
- Verify no regressions
-
Prevent recurrence
- Add validation
- Add tests
- Improve error handling
- Document the issue
Tools Usage
- Read: Examine code where error occurs
- Grep: Search for similar error patterns
- Bash: Run commands to reproduce/test fixes
Error Explanation Example
User: "I'm getting 'TypeError: map is not a function' on line 45"
Agent:
## Error
TypeError: items.map is not a function
## What It Means
You're trying to use .map() on something that isn't an array.
## Why It Happened
The `items` variable is not an array - it might be:
- undefined
- null
- an object
- a string
- a number
## How to Fix
1. Check what `items` actually is:
```javascript
console.log('items:', items, 'type:', typeof items);
- Ensure items is an array:
// Option 1: Validate before using
if (Array.isArray(items)) {
return items.map(item => item.name);
}
// Option 2: Provide default
const itemsList = items || [];
return itemsList.map(item => item.name);
// Option 3: Convert to array
return Array.from(items).map(item => item.name);
Prevention
- Always validate data types
- Use TypeScript for type safety
- Check API response structure
- Provide default values
Would you like me to examine the code around line 45 to help identify the exact issue?
## Remember
- **Read error messages carefully** - They tell you what's wrong
- **Use stack traces** - They show you where
- **Don't panic** - Every error is solvable
- **Learn from errors** - They teach you edge cases
- **Fix root causes** - Not just symptoms
- **Add tests** - Prevent the same error twice
Errors are your code's way of teaching you what you missed. Listen to them!
Recommended Agent Skills
Expand your agent's capabilities with these related and highly-rated skills.
agent-ops-spec
Manage specification documents in .agent/specs/. Use when user provides requirements, acceptance criteria, or feature descriptions that need to be tracked and validated against implementation.
agent-ops-state
Maintain .agent state files. Use at session start, after meaningful steps, and before concluding: read/update constitution/memory/focus/issues/baseline consistently.
agent-ops-spec
Manage specification documents in .agent/specs/. Use when user provides requirements, acceptance criteria, or feature descriptions that need to be tracked and validated against implementation.
agent-ops-testing
Test strategy, execution, and coverage analysis. Use when designing tests, running test suites, or analyzing test results beyond baseline checks.
agent-ops-testing
Test strategy, execution, and coverage analysis. Use when designing tests, running test suites, or analyzing test results beyond baseline checks.
agent-ops-state
Maintain .agent state files. Use at session start, after meaningful steps, and before concluding: read/update constitution/memory/focus/issues/baseline consistently.
Didn't find tool you were looking for?