Skills DirectorySkills Directory
SkillsLearnSecurityCategoriesDocsBlogPro
Sign InSubmit Skill
Skills Directory

Security-tested agent skills for Claude, coding agents, and AI workflows.

Directory

  • Browse Skills
  • All Skills A–Z
  • Claude Skills
  • Claude Code Skills
  • Agent Skills
  • Categories
  • Authors
  • Submit a Skill

Learn

  • Learn Hub
  • Install Claude Skills
  • Write SKILL.md
  • Skills vs MCP
  • Directories Compared

Security

  • Security
  • Methodology
  • Secure Claude Skills
  • Security Badges
  • Chrome Extension
  • Skill Manager

Company

  • About
  • Community
  • Blog
  • API Docs
  • Advertise

2026 Skills Directory. All rights reserved.

ProTermsPrivacyRefunds
Back to skills

error-explainer

ASecurity

Explains error messages and suggests solutions. Use when user encounters errors, exceptions, or cryptic error messages and needs help understanding and fixing them.

14 stars
0 votes
0 copies
0 views
Added 2/7/2026
developmentjavascripttypescriptpythongojavabashreactnodeapidatabase

Works with

cliapi

Security Analysis

A96/100
mediumInstalls packages at runtime which could introduce malicious dependencies

Pro scans all 2 files and shows the line behind each finding

Scanned 2/10/2026

$npx -y skills add a-ariff/ariff-claude-plugins --skill skills --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of error-explainer?

Add the live security badge to your README — it updates automatically with every re-scan.

Security grade badge for error-explainer
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/a-ariff-error-explainer/badge)](https://www.skillsdirectory.com/skills/a-ariff-error-explainer)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
Files
error-explainer.skill.md
---
name: error-explainer
description: Explains error messages and suggests solutions. Use when user encounters errors, exceptions, or cryptic error messages and needs help understanding and fixing them.
allowed-tools: [Read, Grep, Bash]
---

# 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

```markdown
## 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 `undefined` or `null`
- Async data hasn't loaded yet
- Function returned `undefined`
- Missing error handling

**How to Fix:**

```javascript
// ❌ 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:**

```javascript
// ❌ 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/catch` with async/await
- Error in async code not caught

**How to Fix:**

```javascript
// ❌ 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:**

```python
# ❌ 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:**

```python
# ❌ 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:**

```python
# ❌ Problem
email = user_data['email']  # Fails if key doesn't exist

# ✅ Solution 1: Use get() with default
email = user_data.get('email', 'unknown@example.com')

# ✅ Solution 2: Check if key exists
if 'email' in user_data:
    email = user_data['email']
else:
    email = 'unknown@example.com'

# ✅ Solution 3: Try/except
try:
    email = user_data['email']
except KeyError:
    email = 'unknown@example.com'
```

**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)=(user@example.com) 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:**

```javascript
// ❌ Problem
await db.users.create({
  email: 'user@example.com',
  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: 'user@example.com',
  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:**

```javascript
// ❌ 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:**

```javascript
// 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:**

```javascript
// 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:**

```javascript
// ❌ 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:**

```javascript
// ❌ 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:

1. **Read the complete error message**
   - [ ] Error type
   - [ ] Error message
   - [ ] File and line number
   - [ ] Stack trace

2. **Identify the immediate cause**
   - [ ] Which line is failing?
   - [ ] What values are involved?
   - [ ] What was expected vs actual?

3. **Understand the context**
   - [ ] What operation was being performed?
   - [ ] What triggered the error?
   - [ ] Is it reproducible?

4. **Find the root cause**
   - [ ] Is this a symptom of a deeper issue?
   - [ ] What assumptions were wrong?
   - [ ] Are there related problems?

5. **Implement the fix**
   - [ ] Address root cause, not symptom
   - [ ] Test the fix
   - [ ] Verify no regressions

6. **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);
```

2. Ensure items is an array:
```javascript
// 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!

Attribution

a-ariffa-ariff
View sourceSee grades on GitHubMore from a-ariff →
SSkills DirectorySkills Directory

Ship a skill? Prove it's safe.

Free 120-pattern security scan, letter grade, and an embeddable README badge.

Submit a skill

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments (0)

No comments yet. Be the first to comment!

SSkills DirectorySkills Directory

Ship a skill? Prove it's safe.

Free 120-pattern security scan, letter grade, and an embeddable README badge.

Submit a skill

Related Skills

Clean Code

Pragmatic coding standards - concise, direct, no over-engineering, no unnecessary comments

304955 votes

Browser Extension Developer

Use this skill when developing or maintaining browser extension code in the `browser/` directory, including Chrome/Firefox/Edge compatibility, content scripts, background scripts, or i18n updates.

286712 votes

Seo Optimizer

SEO optimization with keyword analysis, readability assessment, technical validation, content quality. Use for search rankings, blog posts, content audits, or encountering keyword density, readability scores, meta tags, schema markup errors.

2222 votes

Google Official Seo Guide

Official Google SEO guide covering search optimization, best practices, Search Console, crawling, indexing, and improving website search visibility based on official Google documentation

1862 votes

Writing Plans

Use when you have a spec or requirements for a multi-step task, before touching code

2927051 votes
View all in development →