エラー処理機構を備えた史上最強のEggフレームワーク
ベストムーバー
例外処理
フレームワークがサポートする非同期プログラミングモデルのおかげで、エラーを完全に解決するために
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
- カスタムエラーハンドラ Ifjsonp: 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
- エラー処理の一般原則。
エラー処理は核となる機能で、以下のルールがあります。
- キャッチされなかった例外は処理されず、スローアップされる
- システム例外はエラーログを出力しますが、標準的な書式フォーマットに従います
- ビジネス例外は、標準フォーマットの形式に基づいています
- コンテントネゴシエーションに基づき、対応するフォーマット値を返します。
- カスタマイズ可能なフォーマット
卵焼き
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
メーカーの拡張機能。
マイクロソフト
メッセージと同様
エラーコード
モジラ
エラーが発生したファイル名
エラーが発生した行番号
エラーが発生した列番号。
エラースタック
- メソッド
try {
throw new Error("Whoops!");
} catch (e) {
alert(e.name + ": " + e.message);
}
特定の
constructor
オブジェクトのソースコード文字列を上書きして、その値を使用して新しいオブジェクトを作成できます。
instanceof
メソッドを使用します。
オブジェクトを表す文字列を返します。
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'
}
関連
-
[解決済み】jquery $.ajaxオブジェクトのresponseJSONプロパティを取得する方法 [重複]。
-
[解決済み】ETIMEDOUTエラーの対処方法は?
-
[解決済み] SyntaxError: JSON の位置 1 に予期しないトークン o があります。
-
[解決済み] esModuleInterop が true の場合、明示的に allowSyntheticDefaultImports を使用して TypeScript transpilation を構成する必要がありますか?
-
[解決済み] Google analytics analytics.js 2つのトラッカーがぶつかり合う?
-
[解決済み] ハンドルバーが定義されていない
-
[解決済み] パッシブイベントリスナー内部でpreventDefaultができない
-
[解決済み] 剣道チェックボックスのチェックイベント
-
[解決済み] VEndを用いた入力規則と要求事項
-
[解決済み] JavaScript の clearTimeout が動作しない
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】FirefoxでGoogle Maps V3をリモートで使用すると「googleが定義されていません」と表示される。
-
[解決済み】ReactJS: 最大更新深度を超えたエラー
-
[解決済み】Uncaught SyntaxError: JSON.parseで予期しないJSON入力の終了(<匿名>)
-
[解決済み】node-request - エラー "SSL23_GET_SERVER_HELLO:unknown protocol" を取得する。
-
[解決済み] Jestのモック関数の呼び出し回数をテスト前に毎回リセットする方法
-
[解決済み] アンダースコアをスペースに置き換えるには?
-
[解決済み] ボタンが2つあるフォームから、ボタンクリック時にAjaxリクエストを送信するにはどうしたらいいですか?
-
[解決済み] JavaScriptで要素に複数の属性を一度に設定する
-
[解決済み] Phaser.jsのゲームに背景画像を設定する方法は?
-
[解決済み] 繰り返しのない配列を効率的に選択する方法は?