0

私は自分のアプリケーションのエラーを処理するための完璧な方法を見つけようとしています。私は方法を考案しましたが(以下を参照)、元のエラーが失われるという事実に悩まされています。

私のコードには次のようなものがあります(これはミドルウェアです):

exports.tokenApi = function( req, res, next, token ){

  Workspace = mongoose.model('Workspace');
  User = mongoose.model('User');

  req.application = {};
  // Find the token
  Workspace.findOne({ 'access.token': token } , function(err, doc){
    if(err){
      next( new g.errors.BadError503('Database error resolving workspace Id') );
    } else {
      if(! doc ){
        next( new g.errors.ForbiddenError403('Access denied') );
      } else {

        // The token is there and it's valid.
        // Set req.application.workspaceId, req.application.login and
        //  req.application.workspace (which contains all of the settings!)
        req.application.workspaceId = doc._id;
        req.application.workspace = doc;
        req.application.login = doc.access.filter(function(entry){ return entry.token == token;  } )[0].login;
      next();
      }
    }

別のファイルでエラーが定義されています。

// Defining the BadError error type, thrown by the application itself
//
function BadError503( message ){
  this.httpError = 503;
  this.message = message || "Internal error";
  this.name = this.constructor.name;
}
util.inherits(BadError503, Error);
exports.errors.BadError503 = BadError503;

// Defining the Error error type, thrown by the application itself
//
function ForbiddenError403( message ){
  this.httpError = 403;
  this.message = message || "User not logged in";
  this.name = this.constructor.name;
}
util.inherits(ForbiddenError403, Error);
exports.errors.ForbiddenError403 = ForbiddenError403;

アプリケーションは、次のようなエラーハンドラを定義します。

exports.AppErrorHandler = function( err, req, res, next){

  var user = null;
  var workspace = null;

  switch(err.name){
    case 'BadError503':
    case 'ForbiddenError403':
      Logger(null, null, 4, 'The application threw an error: ' + err.name + ', message: ' + err.message, req  );
      res.json( { message: err.message }, err.httpError );
    break;

このコードの問題は、元のエラーが失われることです。私は、いわば「正しいことをする」カスタムエラーハンドラーを持っています(上記のコードを参照してください:Ajax経由でエラーを返します)が、実際の問題の理由を何らかの形で保持したいのですが。

これは私に別の質問をもたらします:これは悪い習慣ですか?ある意味で、私は自分自身のエラーをスローし、それを100%処理できるという事実が好きです(私は自分でErrorオブジェクトを作成しました)。しかし、元のエラーを失うことは私には悪い考えのように思えます。

元のエラーを、作成したカスタムエラーのオブジェクトに渡すことができます。それでも...

何かご意見は?または、私が知っておくべき標準的なパターンはありますか?

4

1 に答える 1

1

この記事をチェックしてください:

http://www.devthought.com/2011/12/22/a-string-is-not-an-error/

スタックトレースなどを適切に保持するカスタムエラーオブジェクトを定義する方法について説明します。文字列または既存のエラーオブジェクトを取得し、元のエラーからスタックトレースなどのすべての重要な情報を盗むエラーコンストラクターを定義できます。

次に、エラーを独自の特殊なケースのエラーでラップし、情報を失うことはありません。

于 2012-08-28T18:37:11.550 に答える