ホームページ  >  記事  >  ウェブフロントエンド  >  Node.js でのカスタム エラー タイプの分析

Node.js でのカスタム エラー タイプの分析

不言
不言オリジナル
2018-06-30 14:40:402425ブラウズ

この記事では、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 エラーを処理する場合、次のように記述できます:

var notFountError = require('./error').NotFountError; 
var UserNotFound = function(msg){
 this.constructor.super_(msg);
}

util.inherits(UserNotFound, notFoundError);

これで、エラー処理ミドルウェアを通じてエラー メッセージを処理できるようになります:

rrreee

これerrstatusCode が設定されていない場合、または 500 に等しい場合、エラーは電子メールで送信されます。これにより、404、401、403 などのエラーが排除されます。 console.error(err.stack) の読み取りは実際には期待どおりに機能しません。ノードと同様、V8 ベースの Chrome では Error.captureStackTrace(this, argument.callee ) を使用できます。 > のスタック トレースのエラー コンストラクター。

🎜🎜rrreee🎜🎜🎜🎜もちろん、上で作成した抽象エラータイプを他のカスタムエラーに拡張することもできます: 🎜🎜🎜🎜rrreee🎜🎜🎜 上記はこの記事の全内容です。ヘルプ、その他の関連コンテンツについては、PHP 中国語 Web サイトに注目してください。 🎜🎜関連する推奨事項: 🎜🎜🎜nodejs のモジュール定義の概要🎜🎜🎜🎜🎜nodejs によるページの bigpipe 非同期読み込みの実装方法🎜🎜🎜🎜🎜node.js のシステム ファイルとディレクトリの読み書き方法について🎜🎜🎜🎜🎜 fs モジュール 🎜🎜🎜🎜🎜🎜🎜🎜🎜

以上がNode.js でのカスタム エラー タイプの分析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。