node是对错误处理要求比较高的语言,假如对错误处理没有到位可能会造成程序进程退出
01 前言
错误处理是程序中一个重要的部分,也是判断你的程序是否专业的标准。一般来说我们写程序的时候都会选择使用try…catch来进行错误捕获,或者有时候我们会使用throw进行错误抛出,这是都是常用的错误捕获方法。但是我们在进行node进行开发的时候就会接触到异步过程的中的错误处理。
我们知道在node开发的时候会运用到很多第三方的模块,比如我们经常会使用最大的包管理工具npm,里面下载的包都会放到我们项目当中的node_modules里面,我们打开可以看到里面包含的文件很多,代码量也是巨大的。这里面就会有很多的bug隐患在里面,这时候使用错误捕获就非常有用了。
其实我们一开始想到的就是在全局范围内进行错误的监听,node提供了一个uncaughtException捕获异常,但是这种方法我们会难以定位到错误的发生位置。不应该把该函数当成万能的捕获模块,而是最后的解决方案。
02 Error模块
Error定义了Node中常见的错误类型,我们可以使用Error进行错误的抛出。Error模块里面包含了一个堆栈轨迹用于描述Error是从哪里产生的,一般来说我们可以准确知道错误发生在哪一部分的代码当中,根据错误的描述信息可以快速定位到错误。
var fs = require("fs");
fs.readFile("file",function(err,data){
if(err){
throw new Error("Error!")
}
})
Node程序中产生的所有Error都是使用Error类的实例或者继承自Error类。我们在程序代码不中不仅可以使用回调函数自带的Error模块,而且我们可以显示第捕获错误。比如当你知道逻辑代码运行都某一部分是不对的,应该进行错误的捕获和提醒,你就可以使用:
throw new Error("自定义错误信息!")
03 错误捕获方式
接下来就简单介绍一下Node中我们是如何进行错误捕获的,总的来说我们可以有以下三种方式,try/catch、callback、event。之前我们常用的try/catch方式只适用于同步的调用情况,但是我们知道node中会出现很多的异步调用方式。
try/catch
首先我们应该了解的是在异步操作当中该方法是无法捕获错误的,主要原因就是因为异步调用返回时,代码的上下文已经改变,回调函数当中的代码已经脱离了try/catch的范围,所以是无法捕获的。
同步调用情况:
//这里可以捕获
try{
throw new Error("这里出错了!");
}catch(e){
console.log(e)
}
异步调用情况:
t