1.不处理直接致使程序奔溃,这显然不是咱们想要的 2.致使请求没法被释放,直至链接超时。用户体验体验很是差,咱们要作的应该是在出错时,给用户一个友好的提示,并记录下这次异常,以便排查。
// 每秒钟打印一次时间,确保程序没有奔溃 (function loop() { console.log(new Date().getTime()) setTimeout(function () { loop() }, 1000) })() // 模拟同步代码块内出现异常 let syncError = () => { throw new Error('Sync Error') } // 模拟异步代码块内出现异常 let asyncError = () => { setTimeout(function () { throw new Error('Async Error') }, 100) }
try { syncError() } catch (e) { /*处理异常*/ console.log(e.message) } console.log('异常被捕获了,我能够继续执行')
可是try catch方式没法处理异步代码块内出现的异常,你能够理解为执行catch时,异常尚未发生。javascript
try { asyncError() } catch (e) { /*异常没法被捕获,致使进程退出*/ console.log(e.message) }
fs.mkdir('/dir', function (e) { if (e) { /*处理异常*/ console.log(e.message) } else { console.log('建立目录成功') } })
let events = require("events"); //建立一个事件监听对象 let emitter = new events.EventEmitter(); //监听error事件 emitter.addListener("error", function (e) { /*处理异常*/ console.log(e.message) }); //触发error事件 emitter.emit("error", new Error('出错啦'));
new Promise((resolve, reject) => { syncError() /* or try{ syncError() }catch(e){ reject(e) } */ }) .then(() => { //... }) .catch((e) => { /*处理异常*/ console.log(e.message) })
Promise一样没法处理异步代码块中抛出的异常java
new Promise((resolve, reject) => { asyncError() }) .then(() => { //... }) .catch((e) => { /*异常没法被捕获,致使进程退出*/ console.log(e.message) })
Async/Await是基于Promise的,因此Promise没法捕获的异常,Async/Await一样没法捕获dom
var sleep = function (time) { return new Promise(function (resolve, reject) { syncError() }) }; (async function () { try { await sleep(100); } catch (e) { /*处理异常*/ console.log(e.message) } })()
process方式能够捕获任何异常(无论是同步代码块中的异常仍是异步代码块中的异常)异步
process.on('uncaughtException', function (e) { /*处理异常*/ console.log(e.message) }); asyncError() syncError()
process方式虽然能够捕获任何类型的异常,可是process太过笨重,除了记录下错误信息,其余地方不适合使用,domain这个也能够处理任何类型异常的模块,显然是一个不错的选择。async
let domain = require('domain') let d = domain.create() d.on('error', function (e) { /*处理异常*/ console.log(e.message) }) d.run(asyncError) d.run(syncError)