Node.js下自定義錯(cuò)誤類(lèi)型詳解
前言
一般來(lái)說(shuō),很少人會(huì)考慮如何處理應(yīng)用產(chǎn)生的錯(cuò)誤的策略,調(diào)試的過(guò)程中,簡(jiǎn)單地利用console.log(‘error')
定位錯(cuò)誤,基本夠用了,通過(guò)留下這些調(diào)試信息,能夠?yàn)槲覀円院蟮恼{(diào)試過(guò)程中升了不少時(shí)間,提高了維護(hù)性。所以錯(cuò)誤提示非常重要。同時(shí),也會(huì)帶來(lái)一些比較糟糕用法。最近的項(xiàng)目里就用到了自定義錯(cuò)誤類(lèi)型,覺(jué)得有必要深入了解一下,所以就寫(xiě)了這篇文章,方便自己和有需要的大家在需要的時(shí)候查閱。
Subclassing Error
首先我們可以定義一個(gè) Error 的子類(lèi)。通過(guò) Object.create
和 util.inherits
很容易實(shí)現(xiàn):
var assert = require('assert'); var util = require('util'); function NotFound(msg){ Error.call(this); this.message = msg; } util.inherits(NotFound, Error); var error = new NotFound('not found'); assert(error.message); assert(error instanceof NotFound); assert(error instanceof Error); assert.equal(error instanceof RangeError, false);
可以通過(guò) instanceof
來(lái)檢查錯(cuò)誤類(lèi)型,根據(jù)類(lèi)型進(jìn)行不同的處理。
上面的代碼設(shè)置了自帶的message
, 并且 error
是 NotFound
和 Error
的一個(gè)實(shí)例, 但是不是 RangeError
。
如果用了 express
框架, 就能設(shè)置其他的 properties
讓 error
變得更有用。
比方說(shuō)當(dāng)處理一個(gè)HTTP的錯(cuò)誤時(shí), 就可以寫(xiě)成這樣:
function NotFound(msg) { Error.call(this); this.message = msg; this.statusCode = 404; }
現(xiàn)在就已經(jīng)可以通過(guò)錯(cuò)誤處理的中間件來(lái)處理錯(cuò)誤信息:
app.use(function(err, req, res, next) { console.error(err.stack); if (!err.statusCode || err.statusCode === 500) { emails.error({ err: err, req: req }); } res.send(err.statusCode || 500, err.message); });
這會(huì)發(fā)送HTTP的狀態(tài)碼給瀏覽器, 當(dāng) err
的 statusCode
未設(shè)置或者等于 500 的時(shí)候, 就通過(guò)郵件來(lái)發(fā)送這個(gè)錯(cuò)誤。這樣就能排除那些 404, 401, 403等等的錯(cuò)誤。
讀取 console.error(err.stack)
事實(shí)上并不會(huì)像預(yù)期那樣工作,像 node, chrome 基于 V8 的可以使用 Error.captureStackTrace(this, arguments.callee)
的錯(cuò)誤構(gòu)造函數(shù)來(lái)進(jìn)行堆棧跟蹤。
var NotFound = function(msg) { Error.call(this); Error.captureStackTrace(this, arguments.callee); this.message = msg || 'Not Found'; this.statusCode = 404; this.name = "notFound" } util.inherits(NotFound, Error); export.NotFoundError = NotFound;
當(dāng)然我們還可以將上面這個(gè)創(chuàng)建的抽象錯(cuò)誤類(lèi)型擴(kuò)展到其他自定義錯(cuò)誤中:
var notFountError = require('./error').NotFountError; var UserNotFound = function(msg){ this.constructor.super_(msg); } util.inherits(UserNotFound, notFoundError);
總結(jié)
以上就是Node.js下自定義錯(cuò)誤類(lèi)型的全部?jī)?nèi)容,希望本文的內(nèi)容對(duì)大家學(xué)習(xí)或者使用Node.js能有一定的幫助,如果有疑問(wèn)大家可以留言交流。謝謝大家對(duì)腳本之家的支持。
- 詳解JavaScript中的六種錯(cuò)誤類(lèi)型
- 總結(jié)Node.js中的一些錯(cuò)誤類(lèi)型
- JS常見(jiàn)錯(cuò)誤(Error)及處理方案詳解
- 詳解javascript中的Error對(duì)象
- JS使用onerror捕獲異常示例
- JavaScript通過(guò)使用onerror設(shè)置默認(rèn)圖像顯示代替alt
- IE8 下的Js錯(cuò)誤HTML Parsing Error...
- javascript Error 對(duì)象 錯(cuò)誤處理
- javascript window.onerror事件學(xué)習(xí)新收獲
- 7個(gè)你應(yīng)該知道的JS原生錯(cuò)誤類(lèi)型
相關(guān)文章
用node開(kāi)發(fā)并發(fā)布一個(gè)cli工具的方法步驟
這篇文章主要介紹了用node開(kāi)發(fā)并發(fā)布一個(gè)cli工具的方法步驟,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-01-01Nodejs中session的簡(jiǎn)單使用及通過(guò)session實(shí)現(xiàn)身份驗(yàn)證的方法
session的本質(zhì)使用cookie來(lái)實(shí)現(xiàn)。本文給大家介紹Nodejs中session的簡(jiǎn)單使用及通過(guò)session實(shí)現(xiàn)身份驗(yàn)證的方法,對(duì)node.js session相關(guān)知識(shí)感興趣的朋友一起學(xué)習(xí)吧2016-02-02詳解Node中導(dǎo)入模塊require和import的區(qū)別
本篇文章主要介紹了詳解Node中導(dǎo)入模塊require和import的區(qū)別,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。2017-08-08解決nodejs報(bào)錯(cuò)Error:EPERM:operation not permitted,mkdi
這篇文章主要介紹了解決nodejs報(bào)錯(cuò)Error:EPERM:operation not permitted,mkdir‘xxxxxxxxxxxxxxxx‘問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-02-02node.js做一個(gè)簡(jiǎn)單的爬蟲(chóng)案例教程
這篇文章主要介紹了node.js做一個(gè)簡(jiǎn)單的爬蟲(chóng)案例教程,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07