この記事では、Node.js でのエラーの種類をカスタマイズする方法について詳しく説明します。Node.js を学習または使用する際に参考にしてください。
はじめに
一般的に、デバッグプロセス中にアプリケーションによって生成されたエラーに対処する方法を考慮する人はほとんどいません。単純に console.log('error')
を使用します。基本的にはエラーを見つけるのに十分です。このデバッグ情報を残しておくと、将来のデバッグ プロセスで大幅に時間を節約でき、保守性が向上します。したがって、エラーメッセージは非常に重要です。同時に、悪い使い方も生じます。カスタム エラー タイプは最近のプロジェクトで使用されており、それらについてさらに学ぶ必要があると感じたので、私自身と必要な他のすべての人が必要なときに簡単に参照できるようにこの記事を書きました。 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); });
这会发送HTTP的状态码给浏览器, 当 err
的 statusCode
未设置或者等于 500 的时候, 就通过邮件来发送这个错误。这样就能排除那些 404, 401, 403等等的错误。
读取 console.error(err.stack)
事实上并不会像预期那样工作,像 node, chrome 基于 V8 的可以使用 Error.captureStackTrace(this, arguments.callee)
まず、Error のサブクラスを定義できます。 Object.create
と util.inherits
を使用すると簡単に実現できます:
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;
instanceof
で確認できます。種類に応じて処理方法が異なります。 上記のコードは組み込みの message
を設定しており、 error
は NotFound
と Error
のインスタンスです。ただし、RangeError
ではありません。 express
フレームワークを使用する場合は、他の プロパティ
を設定して error
をさらに便利にすることができます。 たとえば、HTTP エラーを処理する場合、次のように記述できます:
これで、エラー処理ミドルウェアを通じてエラー メッセージを処理できるようになります: これ 以上がNode.js でのカスタム エラー タイプの分析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。var notFountError = require('./error').NotFountError;
var UserNotFound = function(msg){
this.constructor.super_(msg);
}
util.inherits(UserNotFound, notFoundError);
err
の statusCode
が設定されていない場合、または 500 に等しい場合、エラーは電子メールで送信されます。これにより、404、401、403 などのエラーが排除されます。 console.error(err.stack)
の読み取りは実際には期待どおりに機能しません。ノードと同様、V8 ベースの Chrome では Error.captureStackTrace(this, argument.callee )
を使用できます。 > のスタック トレースのエラー コンストラクター。