Explain This Error

Paste any error message and get a plain-English explanation, the likely causes and a fix checklist. Reads browser, HTTP, JavaScript, SQL, PHP, Linux/server and SSL/DNS errors in your browser.

Tool Web & Dev Updated Oct 3, 2026
Learn how this works
How to Use
  1. Paste the whole error message — the error line plus the top of the stack trace or log line, if there is one. More text means a better match.
  2. Leave the family on Auto-detect, or pick one (JavaScript, SQL, PHP…) when a message could belong to several.
  3. Read the explanation card: what the error means, the usual causes, the fix checklist and a link to the full Error Reference page.
  4. Check the readouts for the language, the error type and the file and line it points to, and use Also possible if the best match is not your case.
  5. Open Show Work to see how the text was read and why that rule won. Nothing is uploaded — the matching runs in your browser.
Input
0 characters
Runs locally — your error never leaves this page.
Examples
Explanation
Language
—
Error type
—
File : line
—
Rules matched
—

Worked Example

A JavaScript error. Paste Uncaught TypeError: Cannot read properties of undefined (reading 'map').
Language: JavaScript (the word “Uncaught” and the class name TypeError). Error type: TypeError.
Rules: all 54 are tested and one matches — the signature cannot read propert(y|ies) of (undefined|null) finds “Cannot read properties of undefined”.
Detail: the rule’s extract pattern captures map, so the card says “You read .map of something that was undefined/null.” The array you called .map on did not exist yet — typically data that had not loaded. First fix: items?.map(…) or a default of [].

Two rules match. Paste PHP Parse error: syntax error, unexpected token "}" in /var/www/html/index.php on line 27.
It matches the PHP parse-error rule (its longest signature, syntax error, unexpected, is 24 characters) and the JavaScript unexpected-token rule (16 characters). The longer, more specific signature wins: Parse error: syntax error (PHP), with Unexpected token listed under Also possible.
File and line: /var/www/html/index.php, line 27. PHP reports the line where it gave up, so check line 26 too — a missing ; or ) on the line above is the usual cause.

The common mistake: pasting the browser’s symptom instead of the server’s cause. The console shows GET https://example.com/api/users 500 (Internal Server Error). That matches only the HTTP 500 rule, whose advice is “the real cause is in its logs” — true, but not an answer. The server’s error log for the same request says PHP Fatal error: Uncaught Error: Call to undefined function mysqli_connect() in /var/www/api/users.php:14. That matches Call to undefined function (PHP), names “mysqli_connect()” as the missing function and points at users.php, line 14: the mysqli extension is not enabled in php.ini. A 5xx code always means “go and read the server log”; paste that line instead.

Show Work

Paste an error above to see how it was read: the language, the error type, the file and line, and the rule it matched.

How to Read an Error Message

JavaScript
TypeError: message
at fn (file.js:42:17)
Class, message, then the stack. The first frame is where it threw: file, line, column.
PHP
Fatal error: message in file.php on line 27
Fatal and Parse errors stop the script; Warning, Notice and Deprecated let it carry on.
Python
File "app.py", line 3
“Most recent call last”: the bottom frame and the last line hold the error.
MySQL / SQLSTATE
ERROR 1064 (42000)
Vendor number, then the 5-character SQLSTATE. Class 23 = constraint, 28 = login, 42 = syntax or access.
HTTP status
4xx you · 5xx server
A 4xx means fix the request; a 5xx means read the server log for the real error.
Exit codes
126 · 127 · 128 + n
Not executable, not found, killed by signal n: 137 = 128 + 9 (SIGKILL, often out of memory).
errno names
ENOENT 2 · EACCES 13 · EADDRINUSE 98
No such file, permission denied, port already in use (Linux numbers).
Matching rule
longest matching signature wins
Every rule is a list of patterns; any hit matches, the most specific rule is shown first.

Why Error Messages Look the Way They Do

Most error formats are older than the languages that print them. Unix gave system calls a numeric errno with a short name and a sentence — ENOENT “No such file or directory”, EACCES “Permission denied” — and those exact phrases still appear in Node.js, Python and shell output today. POSIX shells add exit statuses on top: 127 when a command is not found, 126 when it cannot be executed, and 128 plus the signal number when a process is killed, which is why an out-of-memory kill shows up as 137.

HTTP status codes were grouped into five classes by the first digit in HTTP/1.0 (RFC 1945, 1996) and are now defined in RFC 9110 (2022). SQL-92 standardised the five-character SQLSTATE, whose first two characters give the class, and databases kept their own numbers alongside it — MySQL’s 1045, 1062 and 1064 map to SQLSTATE 28000, 23000 and 42000. JavaScript gained try/catch and the standard error classes such as TypeError and ReferenceError in ECMAScript 3 (1999).

Wording changes too. In 2021 V8, the engine in Chrome and Node.js, replaced “Cannot read property 'map' of undefined” with “Cannot read properties of undefined (reading 'map')”, so the rules here recognise both forms.

About This Tool

This tool reads a pasted error message and explains it in plain English: what went wrong, the usual causes, and a short checklist of fixes. It covers 54 common errors across browser/network, HTTP, JavaScript, SQL, PHP, Linux/server and SSL/DNS, and when nothing specific matches it still names the family and gives that family’s general guidance.

The rules are the same data as the Error Reference, so every explanation links to a full page for that error. Alongside the match it reads the language, the error type and the file and line the message points to, and Show Work lists every rule that matched and why the winner won.

Everything runs in your browser. The error text is never uploaded or sent to an AI, so it is safe to paste messages that contain paths, table names or internal hostnames. You can link to a prefilled error with ?q= (and &family=php to fix the family), but typing never changes the address bar.

Related tools: HTTP Status Codes, JSON Validator, and Regex Tester.

Frequently Asked Questions

Is my error message sent to a server or an AI?

No. The text is matched against 54 built-in rules by JavaScript in your browser — nothing is uploaded, logged or sent to an AI service, and typing never writes the error into the address bar. That makes it safe to paste errors containing file paths, table names or internal hostnames.

Which errors does it recognise?

54 specific errors in 7 families: browser/network (CORS, mixed content, ERR_ codes), HTTP status codes (400–504), JavaScript (TypeError, “is not a function”, JSON parse errors), SQL (MySQL 1045, 1062, 1064, 1146…), PHP (parse errors, memory exhausted, headers already sent), Linux/server (permission denied, port in use, exit 137) and SSL/DNS (expired certificate, NXDOMAIN). Each one has its own page in the Error Reference.

It says “no exact match” — what now?

It still guesses the family from keywords and gives that family’s general checklist: net::ERR_ADDRESS_UNREACHABLE matches no rule, but “net::” scores Browser / Network, so you get the DevTools Network-tab steps. Paste more of the message — the error code, the file and line, or the stack trace — for a specific answer.

Why did it pick one error when several matched?

Every matching rule is listed, and the one with the longest (most specific) signature wins. “PHP Parse error: syntax error, unexpected token” matches both the PHP parse-error rule (longest signature 24 characters) and the JavaScript unexpected-token rule (16), so the PHP rule is shown and the other appears under Also possible.

How does it find the file and line?

It reads the standard shapes: PHP’s “in /var/www/html/index.php on line 27”, the first stack frame in JavaScript, such as (/app/src/profile.js:42:17), and the last “File …, line N” of a Python traceback, because Python prints the most recent call last. MySQL’s “at line 1” is the line of the SQL statement, not of your source file.

How do I use the Explain This Error?

Just type your numbers. The answer shows up right away — there is no button to press. Change anything and it updates by itself.

Does it cost anything or need an account?

No. The tool is completely free, there is no account to create, and it keeps working offline after the page first loads.

Is anything I type uploaded?

No. The tool works entirely on your device, so the values you enter never leave your browser.

Common Use Cases

A red console error

Paste “Uncaught TypeError: Cannot read properties of undefined (reading ‘map’)” and learn that .map ran before the data arrived, with optional chaining as the first fix.

A blank PHP page

Paste the line from the error log. “Call to undefined function mysqli_connect()” means the mysqli extension is not enabled in php.ini.

Database errors

SQLSTATE[HY000] [1045] is a rejected login, 1062 is a duplicate key and 1064 is a syntax error near the quoted text — each with its own checklist.

Server and deploy logs

Decode exit code 137 (killed, usually out of memory), EADDRINUSE (port already taken) or “command not found” (not on the PATH) from a CI or systemd log.

Learning to code

See why an error happened instead of copying a fix: Show Work names the language, the error type and the line the message points to.

Last updated: