1. ホーム
  2. javascript

エラー処理機構を備えた史上最強のEggフレームワーク

2022-02-19 15:48:35
<パス

ベストムーバー

例外処理

フレームワーク記事閲覧

フレームワークがサポートする非同期プログラミングモデルのおかげで、エラーを完全に解決するために try catch でキャッチします。アプリケーションコードを書くときは、すべて直接 try catch を使用して例外をキャッチします。

普通に考えれば、この方法ですべての例外をキャッチして処理することができますが、一部の特殊な書き方によって引き起こされる問題には注意が必要です。あまり堅苦しくない例えですが、私たちのコードは全て非同期呼び出しの連鎖で、全ての非同期処理はawaitで連結されていますが、ある場所で非同期呼び出しの連鎖から飛び出すと例外は捕捉されないでしょう。

もし service.trade.check メソッドに不具合があり、実行時に例外がスローされる場合、フレームワークは try catch の場合、フレームワークは最外層で一様にエラーを捕捉しますが、その際 setImmediate のコードは非同期チェーンから「ジャンプ」してしまうので、その中のエラーは捕捉されません。ですから、このようなコードを書くときは注意してください。

フレームワークはこのシナリオを考慮して ctx.runInBackground(scope) このヘルパーメソッドは、このスコープ内のすべてのエラーを一様に捕捉する、別の非同期チェーンをラップしています。

class HomeController extends Controller {
  async buy () {
    const request = {};
    const config = await ctx.service.trade.buy(request);
    // A check is required after the order is placed and does not block the current request
    ctx.runInBackground(async () => {
      // Any exceptions here will be caught by Backgroud and the error log will be printed
      await ctx.service.trade.check(request);
    });
  }
}


例外を確実に追跡できるようにするには、スローされる例外がすべてError型であることを確認する必要があります。Error型だけが問題を突き止めるためのスタック情報を持っているからです。

このフレームワークは オンエラー プラグインは、統一的なエラー処理機構を提供します。あるリクエストのすべてのハンドラメソッド (ミドルウェア、コントローラ、サービス) でスローされた例外はすべてこのプラグインによって捕捉され、 リクエストが取得したいタイプに応じて (たとえば コンテンツ・ネゴシエーション ).

onerrorプラグインは、その設定においてerrorPageUrl属性をサポートしており、これを設定すると、ユーザーがオンラインアプリケーションからHTMLページの例外を要求した場合、このアドレスにリダイレクトされます。

<テーブル 要求仕様のフォーマット 環境について errorPageUrl が設定されている コンテンツを返す HTML & TEXT ローカル & unittest - - onerrorには、エラーの詳細情報を表示するエラーページが付属しています。 HTML & TEXT その他 はい errorPageUrlへのリダイレクト HTML & TEXT その他 いいえ onerror エラーメッセージのない自己完結型のシンプルなエラーページ(推奨しません)。 JSON & JSONP ローカル & unittest - - JSON オブジェクトまたは対応する JSONP フォーマットのレスポンスと詳細なエラーメッセージ JSON & JSONP その他 - JSONオブジェクトまたは対応するJSONP形式のレスポンス(詳細なエラーメッセージなし
// config/config.default.js
module.exports = {
  onerror: {
    // Redirect to this page if an exception occurs on the online page
    errorPageUrl: '/50x.html',
  },
};


フレームワークはデフォルトで統一された例外処理メカニズムを提供しますが、アプリケーション開発では、特にインターフェイスの開発を行う場合、例外発生時の対応にカスタマイズが必要になることがよくあります。フレームワークには、エラー処理メソッドのカスタム設定をサポートする onerror プラグインが付属しており、デフォルトのエラー処理メソッドをオーバーライドすることができます。

404

フレームワークは、サーバーから返された404ステータスを例外として扱いませんが、レスポンスが404でボディが返されない場合、デフォルトのレスポンスを提供します。

  • リクエストがJSON形式の応答を必要とするとフレームワークによって判断された場合、JSONが返されます。

    { "message": "Not Found" }
    
    
    
  • フレームワークによって、リクエストがHTML形式のレスポンスを必要とすると判断された場合、HTMLの一部が返されます。

    404 Not Found

が、404 レスポンスを指定されたページへのデフォルトの HTML リクエストにリダイレクトする設定をサポートすることができます。

// config/config.default.js
module.exports = {
  notfound: {
    pageUrl: '/404.html',
  },
};


レスポンス404のカスタマイズ

// app/middleware/notfound_handler.js middleware
module.exports = () => {
  return async function notFoundHandler(ctx, next) {
    await next();
    if (ctx.status === 404 && !ctx.body) {
      if (ctx.acceptJSON) {
        ctx.body = { error: 'Not Found' }
      } else {
        ctx.body = '

Page Not Found

'; } } }; };

ミドルウェアを設定します。

// config/config.default.js
module.exports = {
  middleware: [ 'notfoundHandler' ],
};


統一されたエラー処理 -- ミドルウェアの形で

ControllerもServiceも例外を投げる可能性があり、クライアント側のパラメータが不正に渡されたことが判明した場合や、バックエンドのサービスが例外で呼び出された場合に例外を投げてブレークさせるという、推奨されるコーディング方法です。

  • コントローラ内 this.ctx.validate() パラメータを検証し、失敗したら例外を投げる。
  • を呼び出す。 this.ctx.curl() メソッドを使ってCNodeサービスにアクセスすると、ネットワークの問題などでサーバーサイドの例外が投げられることがあります。
  • サービス側でCNodeサーバから結果を取得した後、リクエストの呼び出しに失敗したという結果が返ってくることがあり、これも例外がスローされます。

での app/middleware ディレクトリを作成し、新しい error_handler.js ファイルを作成し、新しい ミドルウェア

// app/middleware/error_handler.js
module.exports = () => {
  return async function errorHandler(ctx, next) {
    try {
      await next();
    } catch (err) {
      // All exceptions raise an error event on the app, and the framework logs an error log
      ctx.app.exit('error', err, ctx);

      const status = err.status || 500;
      // The details of the 500 error in the production environment are not returned to the client, as they may contain sensitive information
      const error = status === 500 && ctx.app.config.env === 'prod'
        ? 'Internal Server Error'
        : err.message;

      // Read each property from the error object and set it to the response
      ctx.body = { error };
      if (status === 422) {
        ctx.body.detail = err.errors;
      }
      ctx.status = status;
    }
  };
};



ミドルウェアの読み込み

config/config.default.js
// config/config.default.js
module.exports = {
  // load errorHandler middleware
  middleware: [ 'errorHandler' ],
  // only works for url paths prefixed with /api
  errorHandler: {
    match: '/api',
  },
};

エラーの種類を判定し、カスタムメッセージを返す

  • フレームワークレベルのエラーは、一般的にユーザーに投げられない、メッセージに統一された応答をトロットするためにそこに卵-エラー、または主に修正するためにログを見てください。
  • 業務上、フレームワークレベルとみなされないエラーの中には、Serviceレイヤーで一律にラップできるタイプのものもあります。
  • 一般的なエラーは、egg-onerror またはカスタムコントローラのベースクラスで提供することができます。 throwBizErr この種の処理は

カスタムの適用

  • onerror は主にグローバル例外を処理します。これは基本的にキャッチできない例外で、アプリケーション開発者は例外を投げる場所がわからず、onerror はそれを引き受けるために使用されます。
  • ビジネスエラーは一般的にアプリケーション開発者が知っているものなので、それに応じて処理され、一般的には次のようになります。 対応するエラーテキストが一般的に返されます . 特にこれらのエラーはエラーパレットに表示せず、xxxビジネスの成功率など、他の方法で監視する必要があります。

RFCです。 カスタム4xxおよび5xxシナリオの適用

302で他の場所にジャンプする代わりに、特別なレスポンスの機能をカスタマイズすることができます。

互換性についての考慮点

notfoundは404エラーをスローします。

フレームワークとアプリケーションの両方が app/onerror.js を使用して、統一的な処理ロジックを実装することができます。

  • 正確なステータスハンドラの優先順位付け
  • 見つからない場合は、4xxや5xxのような汎用ハンドラを探す
    • all が利用可能な場合は、まず all を使用し、そうでない場合は 受け入れる html, jsonを選択するための判定
  • もしどちらも見つからない場合は、グローバルなデフォルトのオンエラーハンドラを探します。
 // app/onerror.js
  module.exports = {
    '404': {
      * html(ctx, err) {
        // Here you can use render
        yield ctx.render('404.html');
      },
      * json(ctx, err) {
        // Not handled or not configured or return null, undefined, all will be handled using the default json logic
      },
    },
    '403': function* (ctx, err) {
      // A stripped down version of all
    },
    '4xx': {
      * all(ctx, err) {
        // all does not distinguish between accepts and is handled by the developer
      },
    },
  };


エラーには、捕捉されない例外、システム例外、ビジネス例外の3種類があり、その分類を比較すると、次のようになります。

<テーブル 定義 非捕捉例外 システム例外 ビジネスエラー クラス名 エラー xxxException xxxBizError 説明 js組み込みエラー、処理されない 自ら発生させたシステム例外 自己投影型ビジネス例外 エラーハンドラ onerrorプラグインで処理される ビジネススケーラブル処理 ビジネス・スケーラブル・プロセッシング 認識可能 いいえ はい イエス 属性の拡張機能 いいえ はい イエス

すべてのクラスはErrorクラスを継承し、BaseErrorクラスを定義しています。BaseErrorを継承したErrorは認識されますが、3者ともErrorを継承した他のクラスは認識されません。

クラス名は3種類のエラーを区別するためにのみ使用し、継承はカスタマイズ可能です

ビジネスエラー処理をプラグインに包む 例えば、egg-bizerror。

npmでの説明 :

の使い方を説明します。

// config/plugin.js
exports.bizerror = {
  enable: true,
  package: 'egg-bizerror',
};

// config/config.default.js
exports.bizerror = {
  breakDefault: false, // disable default error handler
  sendClientAllParams: false, // return error bizParams to user, return error parameters to user
  interceptAllError: false, // handle all exceptions, not only bizError exceptions handle all exceptions, not only business exceptions.
};

// config/errorcode.js
module.exports = {
  'USER_NOT_EXIST': {
    status: 400,
    code: '400' // override code value, override code value.
    message: 'can`t find user info',
    errorPageUrl: '', // app will redirect this url when accepts is html 
    addtion1: 'a', // any, will return to browser attached
  },
  'NOT_FOUND': {
    errorPageUrl: (ctx, error) => {
      return '/404.html';
    }
  }
  '404': (ctx, error) => {
    ctx.redirect('/404.html');
    return false; // you can return false, break default logic, break the default logic
  }
}


error.code

SYSTEM_EXCEPTION

APIです。

ctx.throwBizError(code, error, bizParams) - ビジネスロジック

ビズエラーを発生させる

  • コード Error , デフォルト error.bizParams エラー処理時に、この値で設定されたエラーコードを読み取ります。
  • error - エラーメッセージまたは errors オブジェクトを生成します。
  • bizParams - error.code を使用すると、問題を解決するのに役立ちます。

bizParamsは、以下の3つのパラメータも持っています。

  • bizParams.sendClient - オブジェクト、このオブジェクトは、プロパティにコピーされます。 error.log のjsonオブジェクトを作成し、クライアントに送信します。
  • bizParams.code - このコードでカバーできること // throw an error object // error.code // error.message // error.log // error.bizParams // error.bizError ctx.throwBizError('system_exception') ctx.throwBizError(new Error()) ctx.throwBizError({ code: 'system_exception', log: false }) ctx.throwBizError('system_exception', { userId: 1, log: false }) ctx.throwBizError('system_exception', 'error message') ctx.throwBizError('system_exception', new Error()) ctx.throwBizError(new Error(), { userId: 1, log: false }) ctx.throwBizError('system_exception', 'error message', { userId: 1, log: false }) try { this.ctx.body = { data: this.ctx.request.body, }; throw new Error('hahahah'); } catch (error) { this.ctx.throwBizError({ code: '-9999', userId: 1, log: false }); } .
  • bizParams.log - {"code":"-9999","message":"System Exception","errors":{"userId":1}} falseの場合、このエラーをログに残さない、trueの場合、このエラーをログに残す。
bizError: true

// app/service/user.js
module.exports = app => {
  class User extends app.Service {
    async getUserId() {
      let userInfo;
      try {
        userInfo = await this.getUser();
      } catch (error) {
        ctx.responseBizError(error, { bizError: true, code: 'USER_NOT_EXIST' })
        return;
      }
      
      if (!userInfo || !userInfo.id) {
        ctx.throwBizError('USER_NOT_EXIST');
      }
      return userInfo.id;
    }
  }
  return User;
};
 
// app.js
// add handle logic
module.exports = app => {
  app.on('responseBizError', (ctx, error) => {
    if (error.bizParams && error.bizParams.bizType === 'getUser') {
      errorCount++;
    }
  });
};
 
// app.js
// override default handler
module.exports = app => {
  app.BizErrorHandler = class extends app.
    json(ctx, error, config) {
      ctx.body = {
        code: config.code,
        msg: config.message,
      };
    }
  }
};

egg-onerror

その結果、次のようになります。

errorPageUrl: String or Function

  • ctx.responseBizError(error, bizParams)-応答を返します。

    エラーを処理する

    • bizParams - 上記をサポートします。
    • bizParams.bizError - このエラーをプラグインに処理させたい場合、設定されている必要があります。 errorPageUrl そうでない場合は、このエラーがスローされます。

3つ目の呼び出し方法。

  • app.on('responseBizError', (ctx, error) => {}) をご参照ください。

    リスナーを追加して、何らかの処理をさせることができます。

4回目の書き換え。

  • app.BizErrorHandler - デフォルトのハンドラクラス、オーバーライド可

の例です。

accepts: Function

卵のエラー : アンダーライティングに使用

json デフォルトはeggフレームワークにあります。しかし、それでもあなたのシナリオに合うようにオプションを設定する必要があります。

  • html - 本番環境でユーザーが html ページをリクエストし、キャッチできないエラーが発生した場合、エラーページが表示されます。 all: Function .
  • all - ユーザーリクエストの検出 html: Function または text: Function .
  • json: Function - カスタムエラーハンドラ If jsonp: Function が存在する場合、他は無視されます。
  • / config.default.js // errorPageUrl support funtion exports.onerror = { errorPageUrl: (err, ctx) => ctx.errorPageUrl || '/500', }; // an accept detect function that marks all requests with `x-requested-with=XMLHttpRequest` header accepts json. function accepts(ctx) { if (ctx.get('x-requested-with') === 'XMLHttpRequest') return 'json'; return 'html'; } - カスタム html エラーハンドラ。
  • class User extends Controller { async show() { const error = this.check(this.params.id); if (error) { this.ctx.status = 422; this.ctx.body { message: error.message, }; return; } // Continue processing } check(id) { if (!id) return { message: 'id is required' } } } - カスタムテキストエラーハンドラ。
  • Error const { EggError, EggException } = require('egg-errors'); let err = new EggError('egg error'); console.log(EggError.getType(err)); // ERROR - カスタムjsonエラーハンドラ。
  • Exception err = new EggException('egg exception'); console.log(EggException.getType(err)); // EXCEPTION - カスタム jsonp エラーハンドラ。
err = new Error('normal error');
console.log(EggError.getType(err)); // BUILTIN
err = EggError.from(err);
console.log(EggError.getType(err)); // ERROR


一般的なエラー処理の原則。

  • egg-onerrorは、引受を行うフレームワークです。
  • 自分で処理する場合、Controller / Service などで自分でキャッチすることができます。
  • または、Middlewareとmatchを組み合わせてscoped catchを行う。

エラー処理プラグインは現在 エッグオンエラー が、このプラグインは主にキャッチできない例外を優雅に処理する、つまりアプリがハングアップしないようにするためのものでしたが、現在は は、統一されたビジネスエラー処理ソリューションを持っていません .

ビジネスチェックサム

例えば、パラメータ検証、ビジネス検証など、これらと は例外ではありません であり、一般にレスポンスの中で対応するデータ形式に変換されます。これを処理する一般的な方法は、インターフェイスがエラーを返して

const { EggBaseError } = require('egg-errors');

class CustomError extends EggBaseError {
  constructor(message) {
    super({ message, code: 'CUSTOM_CODE' });
  }
 }


例外の種類を区別すること。

既知の例外と捕捉されない例外を区別する。

例えば、ステータスコードはキャッチされないと500を返し、既知の例外は422を返す必要がある、などです〜。

応答を標準化した。

ビジネスがカスタムシステム例外やビジネスエラーを投げる場合、それらはエラー処理の内部で直接処理することができ、捕捉されない例外はonerrorで処理されます。

例えば、HttpErrorには、ハンドラへの入力としてstatusプロパティを追加することができます。

フィールド

  • 標準的なフィールドは以下の通りです。

name: 一般にクラス名、例: NotFoundError

message: エラーの具体的なメッセージ、読み取り可能、例:404 Not Found

code: NOT_FOUNDのような、エラーを表す大文字の文字列

  • http拡張機能

status: httpステータスコード、400

  • エラー処理の一般原則。

エラー処理は核となる機能で、以下のルールがあります。

  1. キャッチされなかった例外は処理されず、スローアップされる
  2. システム例外はエラーログを出力しますが、標準的な書式フォーマットに従います
  3. ビジネス例外は、標準フォーマットの形式に基づいています
  4. コンテントネゴシエーションに基づき、対応するフォーマット値を返します。
  5. カスタマイズ可能なフォーマット

卵焼き

eggjsのエラー

エラーと例外の2種類のエラーを提供します。

作成

import { EggBaseError, ErrorOptions } from 'egg-errors';

class CustomErrorOptions extends ErrorOptions {
  public data: object;
}
class CustomError extends EggBaseError<CustomErrorOptions> {
  public data: object;
  protected options: CustomErrorOptions;

  constructor(options?: CustomErrorOptions) {
    super(options);
    this.data = this.options.data;
  }
}

作成

status

また、通常のエラーオブジェクトからエラーを導入することもできます

headers

エラーも拡張できる。

const { ForbiddenError } = require('egg-errors');
const err = new ForbiddenError('your request is forbidden');
console.log(err.status); // 403


または、tsを使用して、エラーオプションを拡張できるようにします。

BaseError
|- EggBaseError
|- EggError
|- HttpError
| |- NotFoundError
| `- ...
| `- CustomError
`- EggBaseException
   |- EggException
   `- CustomException


ユーザーの場所には、オプションの代わりにメッセージを使用すると、開発者が容易に理解することができます。

HTTPエラーは、400~500のステータスコードを持つエラーオブジェクトに変わる固有のエラーで、HTTPErrorはEggBaseErrorを継承して、2つの const errors = require('egg').errors; const err = new errors.TypeError('ERR_EGG_SOME_ERROR_CODE_STRING', 'Some error haha'); console.log(err.code); // 'ERR_EGG_SOME_ERROR_CODE_STRING' const errors = require('egg').errors; // Register a new subclass with 'ERR_EGG_MY_ERROR' // If 'ERR_EGG_MY_ERROR' exists, a type error will be thrown with the error code 'ERR_EGG_DUPLICATE_CODE' errors.E('ERR_EGG_MY_ERROR', TypeError); const err = new errors.ERR_EGG_MY_ERROR('my error here'); console.log(err.name); // 'TypeError' console.log(err.code); // 'ERR_EGG_MY_ERROR' .

app.use(async ctx => {
  ctx; // is the Context
  ctx.request; // is a Koa Request
  ctx.response; // is a Koa Response
});


利用可能なエラー

ctx.request

RFC:エラーの作り方

先行情報です。

egg および egg プラグインによる既知のすべてのエラー例外は、err.code の指定が必要です。

コメント案です。

  • ビルトインエラー
ctx.response

  • カスタムエラー
ctx.type

メッセージ & コード✋。

エラーは、2つのメッセージ、メッセージ&ampが含まれています。コード、メッセージが変更することができますが、彼は大きな変化を持っていないでしょう、それはパッチや小さな変更を持って、コードは、最初の外観の後に安定したままでなければなりません。

スカイピッグのお偉いさんの言葉です。

  • エラー名の正規化
  • エラーメッセージを国際化することができる
  • 開発者がエラーレポートを取得するためにググるのが簡単
  • は、angularのようなガイドラインを提供することができます。[ https://docs.angularjs.org/error/ <スパン <スパン c o m p i l e / b a d d i r は、その それは ] ( h t t p s : / / d o c s . a n g u l a r j s . o r g / e r r o r / compile/baddir, i.e.](https://docs.angularjs.org/error/) <スパン c o m p i l e / b a d d i r は、その それは ] ( h t t p s <スパン <スパン : <スパン <スパン / / d o c s . a n g u l a r j s . o r g / e r r o r / compile/baddir%EF%BC%8C%E5%8D%B3) のエラーでは、簡単なプロンプトと、開発者がクリックして公式サイトにアクセスし、詳細なガイドラインを参照できるリンクが出力されます。

ctx in koa (ctx.throw())

koa コンテキストはリクエストとレスポンスオブジェクトをラップし、 api やウェブアプリケーションを書くのに非常に便利なメソッドを提供します。これらの操作はHTTPサービス開発のフロンティアで使われており、上位のフレームワークではなくこのレベルで追加することで、ミドルウェアにこの共通機能を実行させることができます。

コンテキストは各リクエストを作成し、ミドルウェアではシートレシピエントまたはctxで識別されます(例)。

ctx.length

コンテキストへのアクセスやメソッドの多くは、以下のように表現することができます。 response または ctx.path というように、使い勝手をよくするために類似している。 ctx.method &です。 request ctx.req ctx.res を表します。 res.statusCode res.writeHead() res.write() res.end() ctx.request ctx.response &です。 ctx.state を表します。

ctx.state.user = await User.find(id);

ctx.app
ctx.cookies.get(name[,options])
signed

nodeでの属性の使用を避ける。

  • ctx.cookies.set(name,value,[options])
    

& maxAge はkoaのオブジェクトです

signed

ミドルウェアとフロントエンドのビューで情報を受け渡すための推奨名前空間です。

expires

path

クッキーは署名されている必要があります

koaはcookieモジュールのオプションを使って、単純にパスします。

/'

Cookieのキーと値のペアを設定するためのオプションです。

  • domain 有効期限をミリ秒単位で設定する
  • secure 署名入りCookieの値
  • httpOnly Cookieの有効期限を示す日付
  • overwrite クッキーのパスです。 ctx.throw([status,msg,promptioes]) デフォルトで
  • ctx.throw(400); ctx.throw(400, 'name required'); ctx.throw(400, 'name required', { user: user }); クッキードメイン
  • const err = new Error('name required'); err.status = 400; err.expose = true; throw err; セキュアクッキー
  • ctx.throw(401, 'access_denied', { user: user }); サーバーアクセス可能なCookieです。 デフォルトで
  • ctx.assert(value,[status],[msg],[properties]) ctx.assert(ctx.state.user, 401, 'User not found. Please login!'); ctx.response 同じ名前で以前設定されたクッキーを上書きするブーリアン値、デフォルトはfalse、trueに設定すると、すべてのクッキーは同じ名前、パスまたはドメインで置き換えられます。

ctx.response=false

エラーをスローします。デフォルトは500です。

request aliases
ctx.header
ctx.headers
ctx.method
ctx.method=
ctx.url
ctx.url=
ctx.originalUrl
ctx.origin
ctx.href
ctx.path
ctx.path=
ctx.query
ctx.query=
ctx.querystring
ctx.querystring=
ctx.host
ctx.hostname
ctx.fresh
ctx.stale
ctx.socket
ctx.protocol
ctx.secure
ctx.ip
ctx.ips
ctx.subdomains
ctx.is()
ctx.accepts()
ctx.acceptsEncodings()
ctx.acceptsCharsets()
ctx.acceptsLanguages()
ctx.get()
response aliases
ctx.body
ctx.body=
ctx.status
ctx.status=
ctx.message
ctx.message=
ctx.length=
ctx.length
ctx.type=
ctx.type
ctx.headerSent
ctx.redirect()
ctx.attachment()
ctx.set()
ctx.append()
ctx.remove()
ctx.lastModified=
ctx.etag=

同じ効果です。

new Error([message[,filename[,lineNumber]]])

これはユーザーレベルのエラーで、err.exposeフラグを使用しています。メッセージはクライアントのレスポンスに適合しており、情報を与えたくないので通常はエラーメッセージではありません。

EvalError

オプションで、そのままエラーにマージされる属性オブジェクトを渡すことができます。 これは、上流のリクエスト元に報告するエラーを、機械的にわかりやすく装飾するために有用です。

eval()

を設定することができます。 InternalError

Koa に応答を処理させるのではなく、生の res オブジェクトを書きたい場合、このオプションを使用します。

RangeError

2018年11月22日(木

javascriptにおけるErrorの知識

  • By エラー のコンストラクタで、エラーオブジェクトを作成することができます。実行時エラーが発生した場合、Error のインスタンスオブジェクトがスローされます。

Errorオブジェクトは、ユーザー定義例外のベースオブジェクトとして使用することもできます。

  • ReferenceError

filename:default は、Error コンストラクタのコードが呼び出されるファイルの名前です。

lineNumber: デフォルトは、Error コンストラクタ コードが呼び出されたファイルの行番号です。

  • 説明

コード実行時にエラーが発生した場合、新しいErrorオブジェクトが作成され、スローされます。

  • JavaScript には、汎用的な Error コンストラクタの他に、6 種類のエラーコンストラクタがあります。

SyntaxError :エラーのインスタンスを作成し、エラーの原因を示します。 eval() 関連する

TypeError : Javascriptエンジンの内部エラーを表す例外をスローするインスタンスを作成します。例えば、"Too much recursion"のようなものです。

URIError 数値変数やパラメーターが有効範囲外であるというエラーの原因を示すエラーインスタンスを作成します。

encodeURI() エラーの原因である「無効な参照」を示すエラーのインスタンスを作成します。

decodeURl() :エラーの原因を示すエラーのインスタンスを作成します。 Error.prototype.message Error.prototype.name コード解析時の構文エラーです。

Error.prototype.description :エラーのインスタンスを作成し、エラーの原因である変数またはパラメータが有効な型でないことを示します。

Error.prototype.number :エラーの原因を示すエラーインスタンスを生成します。 Error.prototype.fileName または Error.prototype.lineNumber 渡されたパラメータが無効である。

  • 標準的な属性です。

Error.prototype.constructor

Error.prototype.columnNumber

メーカーの拡張機能。

マイクロソフト

Error.prototype.stack

メッセージと同様

Error.prototype.toSource()

エラーコード

モジラ

Error

エラーが発生したファイル名

Object.prototype.toSource()

エラーが発生した行番号

Error.prototype.toString()

エラーが発生した列番号。

Object.prototype.toString()

エラースタック

  • メソッド

try { throw new Error("Whoops!"); } catch (e) { alert(e.name + ": " + e.message); }

特定の constructor オブジェクトのソースコード文字列を上書きして、その値を使用して新しいオブジェクトを作成できます。 instanceof メソッドを使用します。

try { foo.bar(); } catch (e) { if (e instanceof EvalError) { alert(e.name + ": " + e.message); } else if (e instanceof RangeError) { alert(e.name + ": " + e.message); } // ... etc }

オブジェクトを表す文字列を返します。 instanceof MyError メソッド

基本的なエラーへの対応

// Create a new object, that prototypically inherits from the Error constructor.
function MyError(message) {
  this.name = 'MyError';
  this.message = message || 'Default Message'; this.stack = (new Error()).stack;
}
MyError.prototype = Object.create(Error.prototype);
MyError.prototype.constructor = MyError;

try {
  throw new MyError();
} catch (e) {
  console.log(e.name); // 'MyError'
  console.log(e.message); // 'Default Message'
}

try {
  throw new MyError('custom message');
} catch (e) {
  console.log(e.name); // 'MyError'
  console.log(e.message); // 'custom message'
}



特定のエラーに対処する。

特定のクラスの例外を処理するために、例外の種類を決定すること、すなわち constructor 属性を使用する場合、最近のJavascriptエンジンを使用する場合は instanceof キーワード

try {
    foo.bar();
} catch (e) {
    if (e instanceof EvalError) {
        alert(e.name + ": " + e.message);
    } else if (e instanceof RangeError) {
        alert(e.name + ": " + e.message);
    }
    // ... etc
}


エラーコンストラクタは、上記の7種類です。

カスタム例外の種類。

エラーベースの例外タイプをカスタマイズすると、新しい MyError() を投げることができ、その際に instanceof MyError を使用して例外の種類を確認します。この要件に対する一般的な解決策は、次のとおりです。

FireFoxでスローされるカスタムタイプの例外は、行番号とファイル名が正しく表示されないことに注意してください。

// Create a new object, that prototypically inherits from the Error constructor.
function MyError(message) {
  this.name = 'MyError';
  this.message = message || 'Default Message'; this.stack = (new Error()).stack;
}
MyError.prototype = Object.create(Error.prototype);
MyError.prototype.constructor = MyError;

try {
  throw new MyError();
} catch (e) {
  console.log(e.name); // 'MyError'
  console.log(e.message); // 'Default Message'
}

try {
  throw new MyError('custom message');
} catch (e) {
  console.log(e.name); // 'MyError'
  console.log(e.message); // 'custom message'
}