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.
messageIf 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.toStringIf 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.traceAlternatively, 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.