1. 基本的な使い方とロジック使用 試す{ //コード.... }キャッチ(エラー){ //エラー処理 }ついに{ // try/catch で何が起こっても (エラーが発生しても発生しなくても)、finally ステートメント内のこのコードは実行される必要があります。 } 論理 2. 特徴try...catch は実行時エラーに対してのみ機能し、インタープリタエラーに対しては適切に機能しません。 試す{ {{{{{{{ }キャッチ(エラー){ コンソール.エラー(err) } // エンジンは「解析時」にミスを犯し、コードを理解できず、それをキャッチできなかった。 try...catch は同期的にのみ動作します 試す{ setTimeout(関数(){ 未定義変数; },1000) }キャッチ(エラー){ コンソール.エラー(err) } //setTimeoutのコールバック関数が実行されると、エンジンはtry...catch構造を離れます 最後に、tryブロック内のreturn文を無効にすることができます。 関数テスト(){ 試す { 1 を返します。 } キャッチ(エラー) { 2を返します。 ついに 3 を返します。 } } コンソールにログ出力します。 //3 3. エラーオブジェクトプログラムでエラーが発生すると、エラーの詳細を含むオブジェクトがjs内に生成され、そのオブジェクトがcatchにパラメータとして渡されます。 すべての組み込みエラーと同様に、エラーオブジェクトには2つの主要なプロパティがあります。
試す { lalala; // エラー、変数が定義されていません。 } キャッチ (エラー) { alert(err.name); // 参照エラー alert(err.message); // lalala は定義されていません alert(err.stack); // ReferenceError: lalala は (...call stack) で定義されていません // エラー全体を表示することもできます // エラーは「name: message」という文字列に変換されます alert(err); // ReferenceError: lalala は定義されていません } 理論的には、何でもエラー オブジェクトとしてスローできますが、組み込みのエラー オブジェクトとの互換性を保つために、名前とメッセージを持つオブジェクトをスローするのがベスト プラクティスです。 追加: 組み込みエラーオブジェクト
4. キャッチアンドスロー戦略の改善エラーをキャッチするのは、プログラムのクラッシュを防ぐためだけではなく、デバッグを容易にし、バグを見つけるためにも重要です。そのため、エラー処理戦略は、コーディング者の優雅さを少し反映することができます。 諺にあるように、コーダーは常にエレガントです。知っているエラーだけをキャッチするという原則に従うようにしてください。 梨を持ち上げて json = '{ "age": 30 }'; 試す{ user = JSON.parse(json); とします。 アラート(ユーザー名); } キャッチ (エラー) { console.error('JSON エラー:'+err); } 上記の例の catch 戦略は、プログラムの正常な動作を保証できます。これは、catch ブロックが内部のすべてのエラーをキャッチできるためです。JSON.parse のエラーでも、user.name が存在しないエラーでも、どちらもキャッチできます。ただし、両方のエラーを同じように印刷することは、デバッグには役立ちません。次のように記述する方がよいでしょう。 json = '{"age":30}' とします 試す{ user = JSON.parse(json); とします。 アラート(ユーザー名) }キャッチ(エラー){ if (err instanceof SyntaxError) { console.error('JSON エラー:'+err); } それ以外の場合はエラーをスローします。 } 各 catch ブロックは、発生する可能性があるとわかっているエラーを処理します。つまり、プログラミング時に、プログラマーは予想されるエラーをキャッチし、予想していなかったエラーを破棄します。 5. Promiseのエラー処理ご存知のとおり、Promise はエラーを吸収します。これは、Promise の実装がすべてのエラーを内部でキャプチャし、キャプチャされたエラーが外部 (Promise の外部) にスローされず、チェーンに沿って最も近い onreject コールバックを見つけることによって渡されるためです。そのため、Promise エラーを処理する方法は 2 つしかありません。
例えば 試す{ 新しいPromise((resolve,reject)=>{ 新しいエラーをスローします('promise error') }).catch(()=>{ // エラーは最新の onreject コールバックでキャッチされます console.error(err); }) }キャッチ(エラー){ // 実行されず、Promise はエラーを飲み込む コンソールエラー(err); } また、executor 関数または promise ハンドラーに関係なく、内部で発生するすべてのエラーは取り込まれ、暗黙的にキャッチされることと同等であることに注意してください。エラーは自動的に最も近い onreject コールバックを見つけて渡します。 試す{ 新しいPromise((resolve,reject)=>{ 解決する(); })。そして()=>{ 新しい Error をスローします ('promise then error')。 }).catch((エラー){ コンソールエラー(err); }) }キャッチ(エラー){ //console.error(err) は地球が破壊されるまで実行されません } 同様に、エラーが見つかりonrejectに渡される前は、onrejectコールバックが見つかり処理されるまで、それまでに登録されたonfulfilledコールバックはすべて無効です。onrejectコールバック後のonfulfilledコールバックは正常です。 試す { 新しい Promise((resolve, 拒否) => { 新しいエラーをスローします('promise error') }).then((ret) => { //エラーは処理されず、失敗します console.log('then1:' + ret) }).catch((エラー) => { //エラーが処理され、後続のシーケンスは通常どおりです console.error(err); '処理済み' を返す }).then((ret) => { //通常実行 console.log('then2' + ret); }) } キャッチ (エラー) { //同様に、人類が滅亡するまでconsole.error(err)は実行されません } // エラー: プロミスエラー //その後処理される チェーン全体にキャッチが設定されていない場合はどうなりますか? そして、このエラーは地球の中心を貫通してグローバル環境まで浸透し、異なるホスト環境に応じて異なるグローバルイベントをトリガーします。たとえば、ブラウザでは unhandledrejection イベントがトリガーされ、ノード環境でも unhandledRejection イベントがトリガーされます。通常、このイベントは監視され、その後、プログラマーまたはユーザーに情報が表示されます。 追加 1: Chromium / v8 / v8 / 3.29.45 の Promise 内部エラー キャプチャ 追加2: async/await エラーキャプチャ 6. パフォーマンスの低下V8 バージョン 6 (Node 8.3 および最新の Chrome に同梱) 以降では、try-catch 内のコードのパフォーマンスは通常のコードと同じです。 ------ 爆栈網 (少しテストしてみましたが、違いはあまりありませんでした) 以上がJavaScriptエラーキャプチャの詳しい説明です。JavaScriptエラーキャプチャの詳細については、123WORDPRESS.COMの他の関連記事にも注目してください。 以下もご興味があるかもしれません:
|
<<: Oracle と MySQL の高可用性ソリューションの比較分析
1. 準備1.1 港ダウンロードハーバーダウンロードアドレス:リンクリンクの説明を追加し、必要なバー...
目次1. プロジェクトの見通し2. 知識ポイントObject.assign() の使用法filter...
Web フロントエンド開発に含まれる内容は、主に W3C 標準の構造、動作、パフォーマンスです。では...
前の記事で説明したフォームの自動入力の問題を解決した後、新しい問題が発生しました。ページの一部のスタ...
メモリストレージエンジンに関する知識ポイントメモリ ストレージ エンジンは日常業務ではほとんど使用さ...
この記事では、マウスを動かしたときにセカンダリ メニュー バーを実装するために HTML+CSS を...
最近、JS の正規表現マッチングの落とし穴を発見したのですが、その時はあまりにも奇妙だったので、何か...
nginx が proxy_pass を設定する場合、末尾に "/" がある U...
ウェブサイトの場合、ユーザビリティとは、ユーザーが必要な情報を効果的に見つけたり、タスクを完了したり...
序文最近、データベースのテーブルに 2 つのフィールドを追加しました。その後、ディスク容量不足のよう...
目次1. vue-video-playerをインストールする2. vue-video-playerを...
目次序文どのような状況でメモリリークが発生する可能性がありますか? 1. 偶発的なグローバル変数2....
目次1. 百度百科事典1. MySQL 2. PostgreSQL 3. MySQL に対する Po...
1 概要システム Centos8 では、httpd を使用してローカル Web サーバーを構築します...
最近、Microsoft は Docker をネイティブにサポートする Windows Server...