非同期処理 JavaScript 非同期コールバックでスローされた例外をキャッチすることは可能ですか?




node uncaughtexception (4)

はい、 window.onerrorのデフォルトの動作を上書きすることができます:

window.onerror = function(message, file, lineNumber) {
  // all errors will be caught here
  // you can use `message` to make sure it's the error you're looking for
  // returning true overrides the default window behaviour
  return true; 
};

JavaScriptのコールバックで例外をキャッチする方法はありますか? それも可能ですか?

Uncaught Error: Invalid value for property <address>

ここにjsfiddleがあります: http://jsfiddle.net/kjy112/yQhhy/ ://jsfiddle.net/kjy112/yQhhy/

try {
    // this will cause an exception in google.maps.Geocoder().geocode() 
    // since it expects a string.
    var zipcode = 30045; 
    var map = new google.maps.Map(document.getElementById('map_canvas'), {
        zoom: 5,
        center: new google.maps.LatLng(35.137879, -82.836914),
        mapTypeId: google.maps.MapTypeId.ROADMAP
    });
    // exception in callback:
    var geo = new google.maps.Geocoder().geocode({ 'address': zipcode }, 
       function(geoResult, geoStatus) {
          if (geoStatus != google.maps.GeocoderStatus.OK) console.log(geoStatus);
       }
    );
} catch (e) {
    if(e instanceof TypeError)
       alert('TypeError');
    else
       alert(e);
}​

あなたの例で何もキャッチしない理由は、いったんgeocode()コールバックが呼び出されると、 try/catchブロックが終了したからです。 したがって、 geocode()コールバックはtryブロックのスコープ外で実行されるため、 tryブロックのキャッチができません。

私が知る限り、JavaScriptのコールバックでスローされた例外をキャッチすることはできません(少なくとも、簡単な方法ではありません)。


JavaScriptのコールバック関数内で発生する例外を実際に捕まえることができます。

キーは、コールバックコード内のtry/catchブロックを設定することです。コールバックコード以外のtry/catchブロックは、コールバックコードが実行されるまでに既に終了しているためです。 したがって、上記のtry/catchブロックでコールバック関数が呼び出されたときにスローされる例外を捕まえることはできませんが、あなたはまだこのようなことを行うことができます:

// this will cause an exception ing google.maps.Geocoder().geocode() 
// since it expects a string.
var zipcode = 30045; 
var map = new google.maps.Map(document.getElementById('map_canvas'), {
    zoom: 5,
    center: new google.maps.LatLng(35.137879, -82.836914),
    mapTypeId: google.maps.MapTypeId.ROADMAP
});
// exception in callback:
var geo = new google.maps.Geocoder().geocode({ 'address': zipcode }, 
   function(geoResult, geoStatus) {
      try {
          if (geoStatus != google.maps.GeocoderStatus.OK) console.log(geoStatus);
      } catch(e){
          alert("Callback Exception caught!");
      }
   }
);

スローされたときに例外をキャプチャすることができます。 私はそれが本当かどうかを100%確信していなかったので、検証するためにいくつかのテストコードを書きました。 例外は、Chrome 19.0.1055.1デベロッパーで予想通りにキャプチャされます。


コンソールログにパッチを当てることで猿のエラーを検出しました。

if(window.console && console.error){
    var old = console.error;
    console.error = function(){
        if(arguments[0].indexOf('Google Maps API error')!=-1){
            alert('Bad Google API Key '+ arguments[0]);
        }
        Array.prototype.unshift.call(arguments);

        old.apply(this, arguments);
    }
}




callback