JavaScriptの例外を処理する方法

Nov 28, 2017 am 10:05 AM
javascript js 方法

プログラマーはプログラムを作成するときに必ずエラーに遭遇します。この記事は JavaScript でのエラー処理の概念に基づいています。 JavaScript プログラムを作成する際の参考になれば幸いです。

デモデモ

使用するデモは GitHub からダウンロードできます。プログラムを実行すると、次のページが表示されます:

JavaScriptの例外を処理する方法

すべてのボタンがエラーをトリガーし、TypeError をスローします。このモジュールの定義は次のとおりです。

// scripts/error.jsfunction error() {var foo = {};return foo.bar();}
ログイン後にコピー


は error() で空のオブジェクト foo を定義しているため、 foo.bar() を呼び出すと、定義されていないためエラーが報告されます。単体テストを使用して検証してみましょう:

// tests/scripts/errorTest.jsit('throws a TypeError', function () {should.throws(error, TypeError);});
ログイン後にコピー


単体テストには Should.js で Mocha を使用しました。

コード ベースを複製し、依存関係パッケージをインストールした後、npm t を使用してテストを実行できます。もちろん、./node_modules/mocha/bin/mocha testing/scripts/errorTest.js のようなテスト ファイルを実行することもできます

信じてください、JavaScript のような動的言語では、誰でも簡単に遭遇してしまいます。このようなエラー。

不正な処理方法

ボタンに対応するイベント処理関数を次のように少し単純化して抽象化しました。

// scripts/badHandler.jsfunction badHandler(fn) {try {return fn();} catch (e) { }return null;}
ログイン後にコピー

badHandler は、badHandler 内で呼び出されるコールバック関数として fn を受け取ります。対応する単体テストを作成します:

// tests/scripts/badHandlerTest.jsit('returns a value without errors', function() {var fn = function()
{return 1;};var result = badHandler(fn);result.should.equal(1);});it('returns a null with errors', function() 
{var fn = function() {throw new Error('random error');};var result = badHandler(fn);should(result).equal(null);});
ログイン後にコピー

例外が発生した場合、badHandler は単純に null を返すことがわかります。コード全体を照合すると、問題が見つかります。

// scripts/badHandlerDom.js(function (handler, bomb) {var badButton = document.getElementById('bad');
if (badButton) {badButton.addEventListener('click', function () {handler(bomb);console.log('Imagine, getting promoted for hiding mistakes');});
}}(badHandler, error));
ログイン後にコピー

エラーが発生したときに try-catch して、null を返すだけだと、何が問題だったのかまったくわかりません。このフェイルサイレント戦略は UI の混乱やデータの混乱を引き起こす可能性があり、デバッグに数時間を費やしても try-catch のコードを無視する可能性があり、これが惨事の原因となります。コードが非常に複雑で、複数レベルの呼び出しがある場合、何が問題になったのかを見つけるのはほとんど不可能になります。したがって、サイレント障害戦略の使用はお勧めしません。より洗練されたアプローチが必要です。

悪くはないがやり方が悪い

// scripts/uglyHandler.jsfunction uglyHandler(fn) {try {return fn();} catch (e) {throw new Error('a new error');}}
ログイン後にコピー

エラーを処理する方法は、エラー e をキャッチしてから新しいエラーをスローすることです。これは確かに、静かに失敗するという以前の戦略よりも優れています。何か問題が発生した場合は、最初にスローされたエラー e が見つかるまで、レイヤーごとに戻ることができます。単にエラー (「新しいエラー」) をスローするだけでは情報が限られており、正確ではありません。エラー オブジェクトをカスタマイズして、より多くの情報を送信します。 。しかし、再度スローされたため、依然として未処理のエラーでした。

例外のインターセプト

1 つのアイデアは、すべての関数を try...catch で囲むことです:

// scripts/specifiedError.js// Create a custom errorvar SpecifiedError = function SpecifiedError(message)
 {this.name = 'SpecifiedError';this.message = message || '';this.stack = (new Error()).stack;};
 SpecifiedError.prototype = new Error();SpecifiedError.prototype.constructor = SpecifiedError;
 、//  scripts/uglyHandlerImproved.jsfunction uglyHandlerImproved(fn) {try {return fn();} catch (e)
  {throw new SpecifiedError(e.message);}}// tests/scripts/uglyHandlerImprovedTest.jsit('returns a specified error with errors',
   function () {var fn = function () {throw new TypeError('type error');};should.throws(function () {uglyHandlerImproved(fn);}, 
   SpecifiedError);});
ログイン後にコピー

ただし、そのようなコードは非常に肥大化し、読みにくく、非効率になります。まだ覚えていますか?この記事の冒頭で、JavaScript の例外は単なるイベントであると述べましたが、幸いなことに、グローバル例外イベント処理メソッド (onerror) があります。

function main(bomb) {try {bomb();} catch (e) {// Handle all the error things}}
ログイン後にコピー

スタック情報を取得

エラー情報をサーバーに送信できます:

// scripts/errorHandlerDom.jswindow.addEventListener('error', function (e) {var error = e.error;console.log(error);});
ログイン後にコピー

より詳細なエラー情報を取得し、データ処理の手間を省くために、fundebug の JavaScript 監視プラグインを使用して迅速に接続することもできます。 3 分以内にバグ監視サービスを開始します。

以下はサーバーが受信したエラー メッセージです:

スクリプトが別のドメイン名の下に配置されている場合、CORS を有効にしないと、スクリプト エラー以外の有用なエラー メッセージが表示されません。具体的な解決策を知りたい場合は、「スクリプトエラーの総合解析」を参照してください。

非同期エラー処理JavaScriptの例外を処理する方法

setTimeout の非同期実行のため、次のコード例外は try...catch によってキャッチされません:

// scripts/errorAjaxHandlerDom.jswindow.addEventListener('error', function (e)
{var stack = e.error.stack;var message = e.error.toString();if (stack) {message += '\n' + stack;}
var xhr = new XMLHttpRequest();xhr.open('POST', '/log', true);// Fire an Ajax request with error detailsxhr.send(message);});
ログイン後にコピー


try...catch ステートメントは現在の例外のみをキャプチャします。実行環境。ただし、上記の例外がスローされると、JavaScript インタプリタは try...catch 内に存在しないため、キャッチできません。すべての Ajax リクエストにも同じことが当てはまります。

少し改善して、非同期関数のコールバックに try...catch を記述することができます:

// scripts/asyncHandler.jsfunction asyncHandler(fn) {try {// This rips the potential bomb from the current contextsetTimeout(function () {fn();}, 1);} catch (e) { }}
ログイン後にコピー

ただし、そのようなルーチンではプロジェクトが try...catch でいっぱいになり、コードは非常に簡潔ではありません。また、JavaScript を実行する V8 エンジンでは、関数内での try...catch の使用は推奨されません。幸いなことに、これを行う必要はありません。グローバル エラー処理 onerror がこれらのエラーをキャッチします。

結論

私のアドバイスは、間違いを隠さず、勇気を出して吐き出すことです。コードのバグによってプログラムがクラッシュすることを誰も恥じる必要はありません。プログラムを中断して、ユーザーが最初からやり直せるようにすることができます。間違いは避けられず、それにどう対処するかが重要です。

上記の内容はJavaScriptエラーの対処方法です。役に立ったと思ったらすぐに保存してください。

関連する推奨事項:

書き込みプロセス中の vue.js の不規則なスペースとエラー報告の問題を解決する方法

PHP インストール拡張機能 mysqli の実装手順とエラー報告に対する完璧なソリューション

MySQLデータベースエラー: 接続が多すぎます 解決策

以上がJavaScriptの例外を処理する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

トマト無料小説アプリで小説を書く方法. トマトノベルで小説を書く方法に関するチュートリアルを共有します。 トマト無料小説アプリで小説を書く方法. トマトノベルで小説を書く方法に関するチュートリアルを共有します。 Mar 28, 2024 pm 12:50 PM

トマト ノベルは非常に人気のある小説閲覧ソフトウェアです。トマト ノベルでは、新しい小説や漫画を読むことができます。どの小説も漫画もとても面白いです。小説を書きたい友達もたくさんいます。お小遣いを稼いで、小説の内容を編集することもできます。 「テキストに文章を書きたいです。それで、小説はどうやって書くのですか?友達は知らないので、一緒にこのサイトに行きましょう。小説の書き方の入門を少し見てみましょう。」 Tomato Novels を使用して小説を書く方法に関するチュートリアルを共有します。 1. まず、携帯電話で Tomato Free Novels アプリを開き、パーソナル センター - ライター センターをクリックします。 2. Tomato Writer Assistant ページに移動し、次の場所で [新しい本の作成] をクリックします。小説の終わり

Colorful マザーボードに BIOS を入力するにはどうすればよいですか? 2つの方法を教えます Colorful マザーボードに BIOS を入力するにはどうすればよいですか? 2つの方法を教えます Mar 13, 2024 pm 06:01 PM

Colorful マザーボードは中国国内市場で高い人気と市場シェアを誇っていますが、Colorful マザーボードのユーザーの中には、設定のために BIOS を入力する方法がまだ分からない人もいます。この状況に対応して、編集者はカラフルなマザーボード BIOS に入る 2 つの方法を特別に提供しました。ぜひ試してみてください。方法 1: U ディスク起動ショートカット キーを使用して、U ディスク インストール システムに直接入ります。ワンクリックで U ディスクを起動する Colorful マザーボードのショートカット キーは ESC または F11 です。まず、Black Shark インストール マスターを使用して、Black Shark インストール マスターを作成します。 Shark U ディスク起動ディスクを選択し、コンピュータの電源を入れます。起動画面が表示されたら、キーボードの ESC キーまたは F11 キーを押し続けて、起動項目を順次選択するウィンドウに入ります。「USB」の場所にカーソルを移動します。 」と表示され、その後

WeChat で削除された連絡先を回復する方法 (簡単なチュートリアルでは、削除された連絡先を回復する方法について説明します) WeChat で削除された連絡先を回復する方法 (簡単なチュートリアルでは、削除された連絡先を回復する方法について説明します) May 01, 2024 pm 12:01 PM

残念ながら、WeChat は広く使用されているソーシャル ソフトウェアであり、何らかの理由で特定の連絡先を誤って削除してしまうことがよくあります。ユーザーがこの問題を解決できるように、この記事では、削除された連絡先を簡単な方法で取得する方法を紹介します。 1. WeChat の連絡先削除メカニズムを理解します。これにより、削除された連絡先を取得できるようになります。WeChat の連絡先削除メカニズムでは、連絡先がアドレス帳から削除されますが、完全には削除されません。 2. WeChat の組み込みの「連絡先帳復元」機能を使用します。WeChat には、この機能を通じて以前に削除した連絡先をすばやく復元できる「連絡先帳復元」機能が用意されています。 3. WeChat 設定ページに入り、右下隅をクリックし、WeChat アプリケーション「Me」を開き、右上隅にある設定アイコンをクリックして設定ページに入ります。

Win11で管理者権限を取得する方法まとめ Win11で管理者権限を取得する方法まとめ Mar 09, 2024 am 08:45 AM

Win11 管理者権限の取得方法のまとめ. Windows 11 オペレーティング システムでは、管理者権限は、ユーザーがシステム上でさまざまな操作を実行できるようにする非常に重要な権限の 1 つです。ソフトウェアのインストールやシステム設定の変更など、一部の操作を完了するために管理者権限の取得が必要になる場合があります。以下にWin11の管理者権限を取得する方法をまとめましたので、お役に立てれば幸いです。 1. ショートカット キーを使用する Windows 11 システムでは、ショートカット キーを使用してコマンド プロンプトをすばやく開くことができます。

携帯電話の文字サイズの設定方法(携帯電話の文字サイズを簡単に調整できます) 携帯電話の文字サイズの設定方法(携帯電話の文字サイズを簡単に調整できます) May 07, 2024 pm 03:34 PM

携帯電話が人々の日常生活において重要なツールになるにつれて、フォント サイズの設定は重要なパーソナライゼーション要件になりました。さまざまなユーザーのニーズを満たすために、この記事では、簡単な操作で携帯電話の使用体験を向上させ、携帯電話のフォントサイズを調整する方法を紹介します。携帯電話のフォント サイズを調整する必要があるのはなぜですか - フォント サイズを調整すると、テキストがより鮮明で読みやすくなります - さまざまな年齢のユーザーの読書ニーズに適しています - フォント サイズを使用すると、視力の悪いユーザーにとって便利です携帯電話システムの設定機能 - システム設定インターフェイスに入る方法 - 設定インターフェイスで「表示」オプションを見つけて入力します。 - 「フォント サイズ」オプションを見つけて、サードパーティでフォント サイズを調整します。アプリケーション - フォント サイズの調整をサポートするアプリケーションをダウンロードしてインストールします - アプリケーションを開いて、関連する設定インターフェイスに入ります - 個人に応じて

モバイルドラゴンの卵を孵化させる秘密が明らかに(モバイルドラゴンの卵をうまく孵化させる方法を段階的に教えます) モバイルドラゴンの卵を孵化させる秘密が明らかに(モバイルドラゴンの卵をうまく孵化させる方法を段階的に教えます) May 04, 2024 pm 06:01 PM

テクノロジーの発展に伴い、モバイルゲームは人々の生活に欠かせないものになりました。かわいいドラゴンエッグの画像と面白い孵化過程で多くのプレイヤーの注目を集めており、その中でも注目を集めているゲームの一つがモバイル版ドラゴンエッグです。プレイヤーがゲーム内で自分のドラゴンをより適切に育成し成長させることができるように、この記事ではモバイル版でドラゴンの卵を孵化させる方法を紹介します。 1. 適切な種類のドラゴン エッグを選択する プレイヤーは、ゲーム内で提供されるさまざまな種類のドラゴン エッグの属性と能力に基づいて、自分に適したドラゴン エッグの種類を慎重に選択する必要があります。 2. 孵化機のレベルをアップグレードします。プレイヤーはタスクを完了し、小道具を収集することで孵化機のレベルを向上させる必要があります。孵化機のレベルは孵化速度と孵化成功率を決定します。 3. プレイヤーはゲームに参加する必要がある孵化に必要なリソースを収集します。

Oracleバージョンの問い合わせ方法の詳細説明 Oracleバージョンの問い合わせ方法の詳細説明 Mar 07, 2024 pm 09:21 PM

Oracleバージョンのクエリ方法を詳しく解説 Oracleは、世界で最も人気のあるリレーショナルデータベース管理システムの1つで、豊富な機能と強力なパフォーマンスを提供し、企業で広く使用されています。データベースの管理と開発のプロセスでは、Oracle データベースのバージョンを理解することが非常に重要です。この記事では、Oracle データベースのバージョン情報をクエリする方法と具体的なコード例を詳しく紹介します。単純な SQL ステートメントを実行して、Oracle データベース内の SQL ステートメントのデータベース バージョンをクエリします。

推奨: 優れた JS オープンソースの顔検出および認識プロジェクト 推奨: 優れた JS オープンソースの顔検出および認識プロジェクト Apr 03, 2024 am 11:55 AM

顔の検出および認識テクノロジーは、すでに比較的成熟しており、広く使用されているテクノロジーです。現在、最も広く使用されているインターネット アプリケーション言語は JS ですが、Web フロントエンドでの顔検出と認識の実装には、バックエンドの顔認識と比較して利点と欠点があります。利点としては、ネットワーク インタラクションの削減とリアルタイム認識により、ユーザーの待ち時間が大幅に短縮され、ユーザー エクスペリエンスが向上することが挙げられます。欠点としては、モデル サイズによって制限されるため、精度も制限されることが挙げられます。 js を使用して Web 上に顔検出を実装するにはどうすればよいですか? Web 上で顔認識を実装するには、JavaScript、HTML、CSS、WebRTC など、関連するプログラミング言語とテクノロジに精通している必要があります。同時に、関連するコンピューター ビジョンと人工知能テクノロジーを習得する必要もあります。 Web 側の設計により、次の点に注意してください。

See all articles