There are three basic patterns for a function to deliver errors. Throw delivers an error synchronously — that is, in the same context where the function was called. If the caller used try/catch, then they can catch the error. If none of the callers did, the program usually crashes. Callbacks are the most basic way of delivering an error asynchronously. The user passes you a function (the callback), and you invoke it sometime later when the asynchronous operation completes. The usual pattern is that the callback is invoked as callback(err, result), where only one of err and result is non-null, depending on whether the operation succeeded or failed. Promise rejections are a common way to deliver an error asynchrously. This method is growing in popularity since the release of Node.js version 8 that includes support for async/await. This allows asynchrounous code to be written to look like synchronous code and to catch errors using try/catch. 3.For more complicated cases, instead of using a callback, the function itself can return an EventEmitter object, and the caller would be expected to listen for error events on the emitter. Please have a Look into this article : https://www.joyent.com/node-js/production/design/errors Thank You.