2016-06-07 2 views
0

Я пытаюсь расширить стороннюю функцию, которая использует try/catch, поэтому, если есть ошибка, я могу ее зарегистрировать внутри. Кажется, я не могу продлить или прототип функции для регистрации ошибки, есть ли у кого-нибудь пример для этого?Расширить стороннюю функцию с помощью try/catch

googletag.cmd.push = function(a) { 
    try { 
     for (var b = sa(), c = 0; c < arguments.length; ++c) try { 
      ea(arguments[c]) && (arguments[c](), this.j++) 
     } catch (d) { 
      this.l++, b.error(Ta(String(d.message))) 
     } 
     b.info(Ua(String(this.j), String(this.l))); 
     return this.j 
    } catch (d) { 
     // custom error logging. 
     O(1001, d) 
    } 
} 
+0

Превышен ли ваш ожидаемый результат с 'O', являющимся вашей функцией обработчика ошибок? Что такое исходный код? –

+0

начальный код - это просто googletag.cmd.push, все функции в нем являются внутренними, я просто хочу в основном расширить catch (d), чтобы сохранить ошибку в javascript obj на странице – user1572796

+0

Так что функция 'push' определяется сценарием, который вы не контролируете, и хотите ли вы его называть и обнаруживать ошибки, улавливаемые внутри 'push'? – Oriol

ответ

0

Это нецелесообразно с помощью javascript.

Самое простое решение - переопределить функцию с вашей пользовательской реализацией, которая была бы идентична, кроме операторов ведения журнала.

Если вам нужно сделать это для многих сторонних функций, я рекомендую посмотреть трансформацию AST через codemods.

+2

попытался переопределить/переопределить функцию, но, похоже, проблема закрытия с функциями в области googletag.cmd.push. т.е. sa() не определено – user1572796

+0

Это снова не то, что вы можете решить, используя чистый javascript. Я думаю, ваш лучший выбор - прибегнуть к трансформации источника. В качестве промежуточной меры вы можете рассмотреть возможность внесения изменений вручную и сохранения различий по отдельности в управлении версиями, чтобы вы могли применять их с помощью таких инструментов, как GNU patch, для последних версий библиотеки. Если вы это сделаете, если библиотека не изменит радикальные изменения вокруг частей, вы по-прежнему сможете пройти незначительные обновления относительно безболезненно. – lorefnon

+0

понял, это то, чего я боялся. Спасибо – user1572796

0

Если функция не подавляет ошибку, и она выходит из функции, вы можете ее уловить.

(function(){ 
    var originalPush = googletag.cmd.push; 
    googletag.cmd.push = function(a){ 
     try{ 
      return originalPush(a); 
     }catch(e){ 
      /* logging */ 
      throw(e); 
     } 
    } 
})() 
+0

Я думаю, что проблема в оригиналеPush имеет попытку/catch, поэтому он никогда не попадет в улов в переопределенной функции – user1572796

Смежные вопросы