Last updated: Mar 4, 2024
Reading timeยท4 min
Access the message
property on the Error object to convert it to string,
e.g. err.message
.
The message
property is a human-readable description of why the error
occurred.
const err = new Error('Something went wrong'); console.log(err.message); // ๐๏ธ "Something went wrong"
When an error is created using the Error() constructor, we can access the message property on the error to get a human-readable string of the reason the error occurred.
Error()
constructor or without extending from it.The best practice is to always throw an error using the error constructor or extend it if you need added functionality.
throw new Error('Something went wrong'); Promise.reject(new Error('Something went wrong'));
Even when rejecting a promise, you can pass an error to the reject()
method.
message
If you have to deal with strange implementations of an error from third-party
packages, you should
check if the error value is an object
and has the message
property to avoid accessing a non-existent property.
const err = null; if ( typeof err === 'object' && err !== null && 'message' in err ) { const message = err.message; console.log(message); }
Our if
condition uses the logical AND (&&) operator, so for the if
block to
run, all conditions have to be met.
err
variable stores a value with a type of object because errors have a type of object.Then we check if the variable is not equal to null.
Unfortunately, if you check the type of null with console.log(typeof null)
,
you will get an "object"
value back, so we have to make sure the value is not
null
.
console.log(typeof null); // ๐๏ธ "object"
message
property.Then we know we can safely access the message
property on the object.
error.toString
If that doesn't work, as a last resort, you can try to access the toString()
method on the error object.
Some third-party packages throw error objects that implement the toString()
method.
const err = null; if ( typeof err === 'object' && err !== null && 'toString' in err ) { const message = err.toString(); console.log(message); }
If that doesn't work either, you have to console.log
the error object and
investigate what properties and methods it implements.
I've also written an article on how to use and format multiple try-catch blocks in JavaScript.
Use the Error.stack property to get the stack trace from an error.
function outer() { function inner() { const err = new Error('๐๏ธ Something went wrong'); console.log(err.stack); } inner(); } outer();
Here is the output of logging the stack
property to the console.
The stack
property of the Error
object shows a trace of which functions were
called, in what order, in which file and on what line.
The line numbers from the message mean:
stack
property on the Error
object was logged on line 10
in the
index.js
file.9
in the inner
function.outer
function called the inner
function on line 13
in the
index.js
file.outer
function was called on line 16
in the global scope of the
index.js
file.console.trace
Alternatively, you can use the console.trace()
method.
The console.trace()
method outputs the stack trace and shows the call path
taken to reach the point at which the method was called.
function outer() { function inner() { console.trace(); } inner(); } outer();
We defined a nested function, in which we called the console.trace() method and invoked the outer function.
The method outputs the stack trace to the console if you're in the browser or to the terminal in Node.js.
The message shows the path taken to reach the point at which we called the
console.trace()
method.
inner
function was called from the outer
function, which was called from the global scope.The message also shows the name of the file in which the functions are defined.
The line numbers from the message mean:
the console.trace
method was invoked in the index.js
file on line 9
.
the inner
function called the console.trace
method on line 9
.
the outer
function called the inner
function in the index.js
file on
line 12
.
the outer
function was called in the global scope of the index.js
file on
line 15
.
Which approach you pick is a matter of personal preference. I'd use the
console.trace
method because it's standardized between browsers.
If you use the stack
property, your results may vary between browsers and
some browsers might drop support for it or not implement it as it is a
non-standard property.