ホームページ > ウェブフロントエンド > jsチュートリアル > JavaScriptでの例外的な例外処理

JavaScriptでの例外的な例外処理

Joseph Gordon-Levitt
リリース: 2025-02-26 08:38:10
オリジナル
616 人が閲覧しました

Exceptional Exception Handling in JavaScript

コアポイント

  • JavaScriptの例外処理は、「try…catch…finally」ステートメントを通じて実装されます。 「Try」句には、例外を生成する可能性のあるコード、例外が発生したときに「キャッチ」句が実行され、結果に関係なく「最終的に」句が実行されるコードが含まれています。
  • JavaScriptには、例外処理用の7つの組み込みエラーオブジェクトがあります:エラー、radeError、ReferencerError、syntaxerror、Typeerror、urieroror、およびevalError。各オブジェクトは、特定のタイプのエラーを表します。
  • JavaScriptを使用すると、開発者は「スロー」ステートメントを使用して独自の例外をスローできます。これにより、意味のあるエラーメッセージの作成が可能になるため、コードがデバッグとメンテナンスを容易にすることができます。
  • 既存の「エラー」タイプを拡張することにより、カスタム例外タイプを作成できます。これにより、複雑なアプリケーションでより具体的で関連性のあるエラー処理が可能になります。
がエラーを発生させるかどうかではなく、がエラーを発する場合です。標準の互換性のないサポートされていない機能とブラウザ機能は、Web開発者が直面する潜在的な問題のいくつかのソースです。発生する可能性のあるすべての問題を考えると、JavaScriptには驚くほど単純なエラー処理方法があります - あきらめて静かに失敗します。少なくとも、これはユーザーが見た動作です。実際、舞台裏で多くのことが起こりました。 javaScriptステートメントがエラーを生成すると、例外をスローすると言われています。 JavaScriptインタープリターは、次のステートメントを実行し続けるのではなく、例外処理コードをチェックします。例外ハンドラーがない場合、プログラムは例外をスローする機能から戻ります。これにより、例外ハンドラーが見つかるか、トップレベルの関数に到達し、プログラムが終了するまで、コールスタックで各関数を繰り返します。

エラーオブジェクト

例外が発生すると、エラーを表すオブジェクトが作成され、スローされます。 JavaScript言語は、7つのタイプの組み込みエラーオブジェクトを定義します。これらのエラータイプは、例外処理の基礎です。各エラータイプについては、以下で詳しく説明します。

エラー

「エラー」タイプは、一般的な例外を示すために使用されます。この例外タイプは、ユーザー定義の例外を実装するために最も一般的に使用されます。ユーザー定義の例外を作成するトピックは、この記事の後半で再検討されます。 「エラー」オブジェクトは、次の例に示すように、コンストラクターを呼び出すことでインスタンス化されます。

「エラー」オブジェクトには、「名前」と「メッセージ」という2つのプロパティが含まれています。 「名前」プロパティは、例外タイプ(この場合は「エラー」)を指定します。 「メッセージ」プロパティは、例外のより詳細な説明を提供します。 「Message」は、例外コンストラクターに渡された文字列からその値を取得します。残りの例外タ​​イプは、より特定のエラータイプを表しますが、一般的な「エラー」タイプと同じ方法で使用されます。

rasineRROR

数値が指定された範囲を超えた場合、「rangeerror」例外が生成されます。たとえば、JavaScriptの数値にはtofixed()メソッドがあり、「数字」パラメーターを使用して小数点以降に表示される数字の数を表します。このパラメーターは0〜20である必要があります(ただし、一部のブラウザはより広い範囲をサポートしています)。 「数字」の値がこの範囲の外側にある場合、「radeerror」がスローされます。次の例はこれを示しています。

var error = new Error("error message");
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

参照エラー

存在しない変数にアクセスすると、「参照エラー」例外がスローされます。これらの例外は、通常、既存の変数名がある場合に発生します。次の例では、「Bar」にアクセスするときに「参照エラー」が発生します。この例では、操作を増加させようとすると、「バー」がアクティブな範囲に存在しないことを前提としていることに注意してください。

var pi = 3.14159;

pi.toFixed(100000);  // RangeError
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

syntaxerror

JavaScript言語ルールに違反すると、「Syntaxerror」がスローされます。 CやJavaなどの言語に精通している開発者は、コンピレーション中に構文エラーに遭遇するために使用されます。ただし、JavaScriptは解釈された言語であるため、コードが実行されるまで構文エラーは認識されません。構文エラーは、回復できない唯一の例外タイプであるため、一意です。 「if」ステートメントには右ブレースがないため、次の例では構文エラーが生成されます。

function foo() {
  bar++;  // ReferenceError
}
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

typeRror

値が予想されるタイプではない場合、「TypeRror」例外が発生します。存在しないオブジェクトメソッドを呼び出そうとすることは、そのような例外の一般的な原因です。次の例では、「foo」という名前の空のオブジェクトを作成し、そのbar()メソッドを呼び出そうとします。 bar()は定義されていないため、「TypeRror」が呼び出されようとするとスローされます。

if (foo) {  // SyntaxError
  // 缺少右花括号
}
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

urierror

var foo = {};

foo.bar(); // TypeError
ログイン後にコピー
evalError

eval()関数が使用されない場合、「evalerror」例外がスローされます。これらの例外は、ECMAScript標準の最新バージョンでは使用されません。ただし、古いバージョン標準との逆方向の互換性を維持するために、それらはまだサポートされています。

例外処理

例外が何であるかがわかったので、プログラムがクラッシュするのを防ぐ方法を学ぶ必要があります。 JavaScriptは、「try…catch…finally」ステートメントを介して例外を処理します。一般的な例のステートメントを以下に示します。

decodeURIComponent("%"); // URIError
ログイン後にコピー
「try ... catch ... catch ... catch ...」という声明の最初の部分は「try」句です。プログラマーが例外を生成する可能性があると疑うコードのブロックを分離するには、「try」句が必要です。 「try」句の後に、1つまたは2つの「キャッチ」と「最後に」条項が続く必要があります。

「キャッチ」条項

「try…catch…actinal」の2番目の部分は「キャッチ」条項です。 「キャッチ」句は、「Try」句で例外が発生した場合にのみ実行されるコードのブロックです。 「キャッチ」条項はオプションですが、それなしでは例外を実際に処理することは不可能です。これは、「キャッチ」条項が例外がコールスタックで伝播するのを防ぎ、プログラムの回復を可能にするためです。 「try」ブロックで例外が発生した場合、コントロールはすぐに「キャッチ」句に渡されます。発生する例外は、処理のために「キャッチ」ブロックにも渡されます。次の例は、「catch」句を使用して「参照エラー」を処理する方法を示しています。 「リファレンスエラー」オブジェクトは、「例外」変数を介して「キャッチ」句で使用できることに注意してください。

var error = new Error("error message");
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

複雑なアプリケーションは、さまざまな例外を生成できます。この場合、「インスタンスオブ」演算子を使用して、さまざまなタイプの例外を区別できます。次の例では、「try」句がいくつかのタイプの例外を生成できると想定されています。対応する「CACT」句は、「TypeError」と「参照エラー」の例外を他のすべてのタイプのエラーとは別に処理するために「インスタンス」を使用します。

var pi = 3.14159;

pi.toFixed(100000);  // RangeError
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

"最後に"節

「try…catch…catch…acting」ステートメントの最後のコンポーネントは、最終的に「「最終的に」句です。 「最終的な」句は、エラーが発生するかどうかに関係なく、「試行」と「キャッチ」条項の後に実行されるコードのブロックです。 「最終的に」句は、とにかく実行する必要があるクリーニングコード(ファイルを閉じるなど)を含めるのに役立ちます。 「最終的に」句が実行されていない場合でも、実行されることに注意してください。この場合、「最終的な」句が実行され、スローされた例外は正常に継続されます。

「最終的な」条項に関する興味深い注意は、「try」または「catch」句が「返品」ステートメントを実行したとしても、実行されるということです。たとえば、「最終的な」句が最後に実行されたコンテンツであるため、次の関数はfalseを返します。

function foo() {
  bar++;  // ReferenceError
}
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

例外

JavaScriptを使用すると、プログラマーは「Throw」という名前のステートメントを通じて独自の例外をスローできます。この概念は、経験の浅い開発者にとって少し混乱する可能性があります。結局のところ、開発者はエラーなしでコードを書くのに苦労していますが、「スロー」ステートメントは意図的にエラーを導入します。ただし、意図的に例外を投げると、実際にコードのデバッグとメンテナンスが容易になる可能性があります。たとえば、意味のあるエラーメッセージを作成することにより、問題を識別して解決する方が簡単です。

以下は、「スロー」ステートメントのいくつかの例を示しています。例外としてスローできるデータ型に制限はありません。また、同じデータをキャプチャしてスローできる回数に制限はありません。言い換えれば、例外をスローし、捕まえてから再びスローすることができます。

if (foo) {  // SyntaxError
  // 缺少右花括号
}
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

「スロー」ステートメントは任意のデータ型で使用できますが、組み込みの例外タイプを使用するにはいくつかの利点があります。たとえば、Firefoxは、例外が発生するファイル名や行番号などのデバッグ情報を追加することにより、これらのオブジェクトを専門としています。

たとえば、

分割操作がアプリケーションのどこかで発生したとします。ゼロによる分裂が発生する状況があるかもしれないので、分割は面倒です。 JavaScriptでは、このような操作は「Nan」になります。これにより、デバッグが困難な紛らわしい結果につながる可能性があります。アプリがゼロで割ることについて大声で不平を言うと、状況ははるかに簡単になります。次の「IF」ステートメントは、例外をスローすることによりこれを行います。

var error = new Error("error message");
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

もちろん、以下に示すように、「rasinError」を使用する方が適切かもしれません。

var pi = 3.14159;

pi.toFixed(100000);  // RangeError
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

カスタム例外オブジェクト

組み込みの例外タイプを使用してカスタムエラーメッセージを生成する方法を学びました。ただし、もう1つの方法は、既存の「エラー」タイプを拡張することにより、新しい例外タイプを作成することです。新しいタイプは「エラー」から継承されるため、他の組み込みの例外タイプと同様に使用できます。この記事では、JavaScriptの継承のトピックについては説明していませんが、ここに簡単な手法が紹介されています。

次の例は、ゼロでディビジョンを処理する問題に戻ります。以前と同様に「エラー」または「rasinError」オブジェクトを使用する代わりに、独自の例外タイプを作成したいと考えています。この例では、「DivisionByzeroError」例外タイプを作成しています。この例の関数は、新しいタイプのコンストラクターとして機能します。コンストラクターは、「名前」と「メッセージ」属性を割り当てる責任があります。この例の最後の2行では、新しいタイプが「エラー」オブジェクトから継承できるようになります。

function foo() {
  bar++;  // ReferenceError
}
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

覚えておくべきこと< 「試してみてください…キャッチ…最後に」ステートメントは、例外を処理するために使用されます。

    "try"句は、例外を生成する可能性のあるコードを識別します。
  • 「キャッチ」句は、例外が発生したときにのみ実行されます。
  • 「最終的な」句は、何があっても常に実行されます。
  • 「スロー」ステートメントは、例外を生成するために使用されます。
  • カスタム例外オブジェクトは、既存の「エラー」タイプから継承する必要があります。
  • Fotoliaの写真
  • JavaScript例外FAQ
  • 処理
JavaScriptの構文エラーとランタイムエラーの違いは何ですか?

解析エラーとも呼ばれる

構文エラーは、従来のプログラミング言語でコンパイル時に発生し、JavaScriptの解釈時間に発生します。構文エラーは、コードが構文的に正しくなく、解析できない場合に発生します。たとえば、クロージングブラケットを忘れたり、違法文字を使用したりすると、構文エラーが発生します。

一方、コンピレーションが成功した後、プログラムの実行中にランタイムエラーが発生します。これらのエラーは通常、コードによって実行される違法な操作によって引き起こされます。たとえば、未定義の変数にアクセスしようとするか、存在しない関数を呼び出すと、ランタイムエラーが発生する可能性があります。

JavaScriptで例外を処理する方法は?

JavaScriptは、例外を処理するためのキャッチステートメントを提供します。 Tryブロックには例外をスローする可能性のあるコードが含まれていますが、CatchブロックにはTryブロックに例外がスローされた場合に実行されるコードが含まれます。簡単な例を次に示します:

var error = new Error("error message");
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

JavaScriptの「最終的な」ブロックの目的は何ですか?

JavaScriptの「最終」ブロックは、結果に関係なく、試行ブロックの後にコードを実行するために使用されます。これは、例外がスローされているかどうかに関係なく、「最終的に」ブロックのコードが実行されることを意味します。通常、ファイルの閉鎖やクリアリソースなど、コードの実行後にクリーンアップするために使用されます。

JavaScriptで独自の例外を投げることはできますか?

はい、JavaScriptを使用すると、「スロー」ステートメントを使用して独自の例外をスローできます。文字列、数字、ブール値、オブジェクトなど、あらゆるタイプの例外をスローできます。例外がスローされると、プログラムの通常のプロセスが停止され、制御が最新の例外ハンドラーに渡されます。

JavaScriptでカスタムエラータイプを作成する方法は?

JavaScriptを使用すると、組み込みのエラーオブジェクトを拡張してカスタムエラータイプを作成できます。これは、コードに特定のタイプのエラーをスローする場合に役立ちます。例は次のとおりです。

var pi = 3.14159;

pi.toFixed(100000);  // RangeError
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

JavaScriptのエラー伝播は何ですか?

エラー伝播とは、コールスタックの最も近い例外ハンドラーにスローされた場所からエラーを渡すプロセスを指します。エラーをスローする関数にエラーが発生しない場合、呼び出し関数に上向きに伝播されます。その時点で、プログラムが終了するグローバルスコープにキャプチャまたは到達するまで伝播します。

JavaScriptでエラーを記録する方法は?

javaScriptは、ログにconsole.error()メソッドを提供します。このメソッドはConsole.log()と同じように機能しますが、ログにスタックトレースも含まれており、メッセージをコンソールのエラーとして強調表示します。例は次のとおりです。

function foo() {
  bar++;  // ReferenceError
}
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

JavaScriptの「null」と「未定義」の違いは何ですか?

JavaScriptでは、「null」と「未定義」の両方が欠損値を示します。ただし、わずかに異なるコンテキストで使用されます。 「未定義」とは、変数が宣言されたが、値は割り当てられていないことを意味します。一方、「null」は割り当て値であり、値またはオブジェクトがないことを示します。

JavaScriptの非同期エラーを処理する方法は?

非同期エラーは、JavaScriptでPromiseまたはAsync/awaitを使用して処理できます。 Promiseには、Promiseが拒否されたときに呼び出される「CACT」メソッドがあります。 Async/awaitを使用すると、同期コードと同じようにTry/Catchブロックを使用できます。以下は、async/awaitを使用した例です

JavaScriptのTypeRrorとは何ですか?
if (foo) {  // SyntaxError
  // 缺少右花括号
}
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

通常、値が予想されるタイプでない場合、操作を実行できない場合、typeRrorはJavaScriptにスローされます。たとえば、非機能を呼び出したり、未定義のプロパティにアクセスしたりしようとすると、TypeRrorが発生します。

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

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート