javaScriptの異常な捕獲について

21901 ワード

異常捕獲はブラウザ側とnodejs側に分かれています.
  • ブラウザ
  • nodejs
  • ブラウザ
    1.疑わしい領域はtry...catchを追加して、非同期コードを処理できません.2.グローバル監視JS異常:window.onerror 3.グローバル監視静的リソース異常:window.addEventListener 4.グローバルキャプチャcatchがないpromise異常:unhandledjection
    window.addEventListener("unhandledrejection", function(e){
      // e.preventDefault(); //         
      console.log('     :', e);
    });
    Promise.reject('promise error').then();
    
    5.iframe異常:window.error 6.VUE error HandlerとReact component DidCatch 7.ウェブページの崩壊を監視する:windowオブジェクトのロードとbeforeunload
    window.addEventListener('load', function () {
        sessionStorage.setItem('good_exit', 'pending');
        setInterval(function () {
            sessionStorage.setItem('time_before_crash', new Date().toString());
        }, 1000);
      });
    
      window.addEventListener('beforeunload', function () {
        sessionStorage.setItem('good_exit', 'true');
      });
    
      if(sessionStorage.getItem('good_exit') &&
        sessionStorage.getItem('good_exit') !== 'true') {
        /*
            insert crash logging code here
        */
        alert('Hey, welcome back from your crash, looks like you crashed on: ' + sessionStorage.getItem('time_before_crash'));
      }
    
    8.Script ErrorクロスドメインcrossOrigin解決nodejs
    1. わしいエリアにtry…catchを して、 コードを できません.
    try {
      setTimeout(() => {
        throw new Error('error');
      })
    } catch(e) {
      console.log('      ,           ');
      console.log(e);
    }
    
    2.イベント で を する
    const events = require('events');
    
    //           
    const emitter = new events.EventEmitter();
    
    //   error  
    emitter.addListener('error', (e) => {
      //       
      console.log(11122222); //     1112222         
      console.log(e);
    });
    
    //    error  
    emitter.emit('error', new Error('      '))
    
    3.calbackの
    const fs = require('fs');
    
    fs.mkdir('/dir', (e) => {
      if (e) {
        console.log('      ');
        console.log(e);
      } else {
        console.log('      ');
      }
    });
    
    4.Promise は な で、 されていないpromiseのrejectは に かに べます.これは が しいのではありません.
    new Promise((resolve, reject) => {
      throw new Error('error');
    }).then(() => {
      // 。。。。
    }).catch((e) => {
      console.log('              ');
      console.log(e);
    });
    //  
    process.on('unhandledRejection', (reason, p) => {
        console.log("Unhandled Rejection at: Promise ", p, " reason: ", reason);
        // application specific logging, throwing an error, or other logic here
    });
    
    5.Async/Await
    const testFunc = function() {
      return new Promise((resolve, reject) => {
        throw new Error('error');
      });
    };
    
    async function testAsync() {
      try {
        await testFunc();
      } catch (e) {
        console.log('   ,       ');
        console.log(e);
      }
    }
    
    testAsync();
    
    6.process (この はすべての を することができる).
    process.on('uncaughtException', (e) => {
      console.log('    ,        ');
      console.log(e);
    });
    
    function testFunc() {
      throw new Error('error');
    }
    
    testFunc();
    
    7.domain domainは、 と を む のタイプの な を することもできる.
    const domain = require('domain');
    const d = domain.create();
    
    d.on('error', (e) => {
      console.log('    ,       ');
      console.log(e);
    });
    
    d.run(() => {
      throw new Error('      ');
    });