小编给大家分享一下在节点应用中进行错误异常处理的方法,希望大家阅读完这篇文章之后都有所收获、下面让我们一起去探讨吧!
不知道你有没有遇到这样一种情况,某天你写的代码在线上突然发生错误,然后你打开控制台,却对着打过包的错误信息毫无头绪?又或者说是代码在节点端出现了问题,你查看错误日志的时候,却发现日志文件中都是杂乱的错误堆栈信息。
其实上面这些问题都可以通过在代码中引入合适的错误机制进行解决。大部分时候,由于程序员在开发过程中更加关注需求的实现,反而会忽视一些底层的工作,而错误处理机制就相当于我们代码上的最后一道保险,在程序发生已知或者意外的问题的时候,可以让开发者在第一时间获取信息,从而快速定位并解决问题。
<强>常用的错误处理机制强>
首先我们来了解一下目前前端领域到底有哪些错误处理机制。
<强>尝试抓住强>
试试……抓住这种错误处理机制一定是大家最熟悉的,Javascript语言内置的错误处理机制可以在检测到代码异常的时候直接进行捕获并处理。
function 测试(),{ ,try { ,throw new 错误(“error"); }大敌;抓(err), { ,console.log (“some  error 发生了:“); ,} } , 测试()
<强>节点原生错误处理机制强>
大多数节点。js核心API都提供的是利用回调函数处理错误,例如:
const fs =,要求(& # 39;fs # 39;); function read (), { ,fs.readFile(“/一些/文件/does-not-exist",,(呃,,数据),=祝辞,{ ,如果(err) { throw 才能;new 错误(“file not exist"); ,} ,console.log(数据); ,}); } read ();
通过回调函数的犯错参数来检查是否出现错误,再进行处理。之所以node . js采用这种错误处理机制,是因为异步方法所产生的方法并不能简单地通过试一试……抓机制进行拦截。
<强>承诺强>
承诺是用于处理异步调用的规范,而其提供的错误处理机制,是通过抓方法进行捕获。
fs.mkdir (“。/temp"),然后((),=祝辞,{ ,fs.writeFile (“。/temp/foobar.txt",,“hello"); }).catch (err =祝辞,{ ,console.log (err) });
<强>异步/等待+试着抓住强>
第三种错误处理机制是采用异步/等待语法糖加上试试……抓住语句进行的。这样做的好处是异步和同步调用都能够使用统一的方式进行处理了。
async function 一个(),{ ,await 两个(); } async function 两个(),{ ,await “hello"; ,throw new 错误(“error"); } async function 测试(),{ ,try { ,await 一个(); }大敌;抓(错误),{ ,console.log(错误); ,} } 测试();
<强>解决方案强>
<强> promisify 强>
如果你的代码中充斥着多种不同的错误处理模式,那么维护起来是十分困难的。而且代码的可读性也会大大降低,因此,这里推荐采用的统一的解决方案。对于同步代码来说,直接使用试一试……抓住方式进行捕获处理即可,而对于异步代码来说,建议转换然成承诺后采用异步/等待+试一试……抓住这种方式进行处理。这样风格统一,程序的健壮性也大大加强。例如下面这个数据库请求的代码:
const database =,要求(“database"); function promiseGet(查询),{ ,return new 承诺((解决,,拒绝),=祝辞,{ database.get(才能查询,,(呃,,结果),=祝辞,{ ,,if (err), { ,,,拒绝(错); ,,},{else ,,,解决(结果); ,,} })才能 ,}) } async function main (), { ,await promiseGet (“foo"); } main ();
<>强自定义错误类型强>
直接使用系统原生的错误信息通常会显得太过单薄,不利于后续进一步的分析和处理,所以为了让代码的错误处理机制的功能更加强大,我们势必要多花点精力进行额外的改造。
可以通过扩展基础的错误类型来达到这一目的。
一般来说,要根据错误发生的位置采用不同的错误类型。
首先是应用层错误,它会保存额外的线索数据: