javascript, устанавливающий пользовательский обработчик ошибок для сторонних плагинов или модулей - PullRequest
0 голосов
/ 10 июля 2010

Я пытаюсь установить собственный обработчик ошибок для сторонних плагинов / модулей в моей базовой библиотеке, но каким-то образом myHandler не предупреждает e.message.

Может кто-нибудь помочь мне, пожалуйста? спасибо

Function.prototype.setErrorHandler = function(f) {
 if (!f) {
  throw new Error('No function provided.');
 }
 var that = this;
 var g = function() {
  try {
   var a = [];
   for(var i=0; i<arguments.length; i++) {
    a.push(arguments[i]);
   }
   that.apply(null,a);
  }
  catch(e) {
   return f(e);
  }
 };
 g.old = this;
 return g;
};


function myHandler(e) {
 alert(e.message)
};

// my Core library object
(function(){
 if (typeof window.Core === 'undefined') {
  var Core = window.Core = function() {
   this.addPlugin = function(namespace, obj){
    if (typeof this[namespace] === 'undefined') {
     if (typeof obj === 'function') {
      obj.setErrorHandler(myHandler);
     } else if (!!obj && typeof obj === 'object') {
      for (var o in obj) {
       if (obj.hasOwnProperty(o) && typeof obj[o] === 'function') {
        obj[o].setErrorHandler(myHandler);
       }
      }
     }

     this[namespace] = obj;

     return true;
    } else {
     alert("The namespace '" + namespace + "' is already taken...");
     //return false;
    }
   };
  };

  window.Core = new Core();
 }
})();

// test plugin
(function(){
 var myPlugin = {
  init: function() {},
  conf: function() {
   return this.foo.x; // error here
  }
 };

 Core.addPlugin("myPlugin", myPlugin);
})();

// test
Core.myPlugin.conf(); // supposed to alert(e.message) from myHandler()

1 Ответ

0 голосов
/ 01 августа 2010

setErrorHandler в приведенном выше коде не устанавливает обработчик ошибок для функции как таковой.JavaScript не дает вам возможности изменять вызываемый код внутри объекта Function.

Вместо этого он создает упакованную версию вызываемой функции и возвращает ее.

obj.setErrorHandler(myHandler);

Можетне работает, так как возвращаемая функция-обертка выбрасывается, ни к чему не приписываемаяс разными, упакованными версиями.Это не обязательно будет работать во всех случаях и, безусловно, может привести к путанице в стороннем коде.По крайней мере, вы хотели бы убедиться, что вы не оборачиваете функции дважды, а также сохраняете значение времени вызова this в оболочке:

that.apply(this, a);

(Примечание: вам не нужноручное преобразование arguments в массив. Допустимо передать объект arguments непосредственно в apply.)

...