這篇文章給大家詳細介紹如何在Node.js下自訂錯誤類型,對大家學習或使用Node.js具有一定的參考借鑒價值,有需要的朋友們可以參考借鑒,下面來一起看看吧。
前言
一般來說,很少人會考慮如何處理應用產生的錯誤的策略,在調試的過程中,簡單地利用console.log('error')
定位錯誤,基本上夠用了,透過留下這些調試信息,能夠為我們以後的調試過程中升了不少時間,提高了維護性。所以錯誤提示非常重要。同時,也會帶來一些比較糟糕用法。最近的專案裡就用到了自訂錯誤類型,覺得有必要深入了解一下,所以就寫了這篇文章,方便自己和有需要的大家在需要的時候查閱。
Subclassing Error
#首先我們可以定義一個 Error 的子類別。透過Object.create
和util.inherits
很容易實現:
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);
instanceof 來檢查錯誤類型,依照類型進行不同的處理。
message,並且
error 是
NotFound 和
Error 的一個實例,但不是
RangeError。
express 框架, 就能設定其他的
properties 讓
error 變得更有用。
比方說當處理一個HTTP的錯誤時,就可以寫成這樣:
function NotFound(msg) { Error.call(this); this.message = msg; this.statusCode = 404; }
現在就已經可以透過錯誤處理的中間件來處理錯誤訊息:
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); });
err 的
statusCode 未設定或等於500 的時候, 就透過郵件來傳送這個錯誤。這樣就能排除那些 404, 401, 403等的錯誤。
console.error(err.stack) 事實上並不會像預期那樣工作,像node, chrome 基於V8 的可以使用
Error.captureStackTrace(this, arguments.callee) 的錯誤建構子來進行堆疊追蹤。
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;
當然我們也可以將上面這個建立的抽象錯誤類型擴展到其他自訂錯誤:
var notFountError = require('./error').NotFountError; var UserNotFound = function(msg){ this.constructor.super_(msg); } util.inherits(UserNotFound, notFoundError);
關於node.js基於fs模組對系統檔案及目錄進行讀寫操作的方法
以上是Node.js下自訂錯誤類型的解析的詳細內容。更多資訊請關注PHP中文網其他相關文章!