传统 Node 风格的错误处理是使用回调函数实现的。下面是一个例子,该例子摘自《深入浅出 RXJS》。虽然这本书是讲 RXJS 的,但看到这里,我觉得还是有必要再记录一下。
Node 风格的错误处理方式的特点:方法内部使用 try...catch
捕获错误,当发生错误时,将错误对象传递给回调函数的第一个参数,如果没有错误发生,将 null
传递给回调函数的第一个参数,将处理结果传递给回调函数的第二个方法。
在回调函数中,首先对第一个参数进行判断,如果该参数为真,即上层操作产生了错误,需要进行相应处理。如果该参数为假,即上层操作正常,已经取得了正确结果,需要对正确的结果进行处理。
例子
定义一个反序列化 JSON 的 parseToJSON 方法:
function parseToJSON(str:string,cb:(err,res) => any):void{
try{
const res = JSON.parse(str)
cb(null,res);
}catch(e){
cb(e,null);
}
}
调用该方法:
parseToJSON("[]",(err,res) => {
if(err){
console.log(err)
return;
}
console.log(res)
})
parseToJSON("xxx",(err,res) => {
if(err){
console.log(err)
return;
}
console.log(res)
})
运行结果:
[]
SyntaxError: Unexpected token x in JSON at position 0
嵌套问题
如果涉及到嵌套操作,就会引发回调地狱:
parseToJSON("[]",(err,res) => {
if(err){
console.log("第一次转换错误:",err)
return;
}
console.log("第一次转换:",res)
parseToJSON("{}",(err,res) => {
if(err){
console.log("第二次转换错误:",err)
return
}
console.log("第二次转换:",res)
parseToJSON("xxx",(err,res) => {
if(err){
console.log("第三次转换错误:",err)
return
}
console.log("第三次转换:",res)
})
})
})
运行结果:
第一次转换: []
第二次转换: {}
第三次转换错误: SyntaxError: Unexpected token x in JSON at position 0
完。