Ловля всіх винятків без керування JavaScript


112

Я намагаюся знайти або з'ясувати спосіб відобразити у вікні попередження всі необроблені винятки javascript у програмі. Я б хотів, щоб все це було зроблено на стороні клієнта, не використовуючи жодного коду на стороні сервера. Я використовую MVC3 як середовище.

Я досліджував останні кілька днів і не знайшов саме того, що шукаю.

Нижче я знайшов два способи, схожі на те, що вони майже те, що я шукаю, за винятком цих способів, встановлених так, що вам потрібно передати ім'я функції в спеціальний метод для друку сліду стека всіх незроблених винятків у межах цього конкретна функція. Я шукаю спосіб не потрібно вручну передавати ім'я функції власному методу, який друкує стеження стека всіх незроблених винятків. Я хотів би, щоб цей нестандартний метод просто "прослуховував" всі необроблені винятки у всій програмі.

http://eriwen.com/javascript/js-stack-trace/

Також щось подібне до попереднього посилання:

https://github.com/eriwen/javascript-stacktrace

Ось основний код із 2-го посилання вище, що друкує трасування стека вказаної функції javascript:

instrumentFunction: function (context, functionName, callback) {
    context = context || window;
    var original = context[functionName];
    context[functionName] = function instrumented() {
        callback.call(this, printStackTrace().slice(4));
        return context[functionName]._instrumented.apply(this, arguments);
    };
    context[functionName]._instrumented = original;
}

function printStackTrace(options) {
    options = options || {
        guess: true
    };
    var ex = options.e || null,
        guess = !! options.guess;
    var p = new printStackTrace.implementation(),
        result = p.run(ex);
    return (guess) ? p.guessAnonymousFunctions(result) : result;
}

Отже, підсумовуючи це, чи всі ви знаєте про який-небудь спосіб мати якийсь "слухач", щоб слухати всі винятки без оброблення JavaScript, а потім надрукувати їх на екрані у вікні попередження?

Дякую! Джейсон


одне ... що б ти використовував вікно попередження?!? ви можете використовувати console.log (error_message) для ....
Mathlight

1
Я думаю, що це питання допоможе вам вирішити всі помилки JS
Pilgerstorfer Franz

Вам, мабуть, варто поглянути на це питання: stackoverflow.com/questions/205688/…
Марк

Відповіді:


129

Це можна зробити за допомогою методу window.onerror.

window.onerror = function myErrorHandler(errorMsg, url, lineNumber) {
    alert("Error occured: " + errorMsg);//or any message
    return false;
}

13
Набагато краще, ніж намагатися завернути весь додаток у блок спробу / лову. :) Дякую!
Ентоні

15
Лише вгору: "Зауважте, що деякі / багато подій помилок не запускають window.onerror, ви повинні спеціально їх слухати." - developer.mozilla.org/en-US/docs/Web/API/…
shusson

6
у цьому коді немає необхідності включати ім'я функції (myErrorHandler) ... може бути лише функція (errorMsg, url, lineNumber)
JoelFan

18
@JoelFan, краще мати ім’я функції для налагодження. Відладчик використовуватиме ім'я функції замість того, щоб відображатись як анонімна функція.
Джеріна

Це приголомшливо і дякую! намагався налагодити складний сценарій збільшення масштабування фотографій, який працює нормально 100% часу, за винятком мобільних сафаїв, де він випадково виходить з ладу, і де немає вікна "консолі" чи "розробника", щоб побачити, що сталося. Звичайно, у мене є власне "налагоджуюче" вікно, яке я можу ввімкнути за допомогою секретної кнопки, але у мене не було способу глобально побачити кожну помилку, яку я не робив "спробувати / застати". Це додаток показало мені ТОЧНО, де проблема, і не пошкодило моєму розриву більше волосся! Хотілося б, щоб я міг проголосувати за це двічі!
Ренді

48

Ви можете або використовувати window.onerror, або (дивно!) Прив’язати до події "помилка" належним чином:

window.onerror = function (message, file, line, col, error) {
   alert("Error occurred: " + error.message);
   return false;
};
window.addEventListener("error", function (e) {
   alert("Error occurred: " + e.error.message);
   return false;
})

Якщо ви хочете відслідковувати помилки JavaScript, ви можете спробувати Atatus . Я працюю в Atatus.


7
чому ви "повертаєте помилкове" твердження?
kumaresan_sd

@kumaresan_sd дозволяє оброблювачеві подій за замовчуванням стріляти: developer.mozilla.org/en-US/docs/Web/API/GlobalEventHandlers/…
Jens Bodal

29

Окрім

window.onerror = function (message, file, line, col, error) {
   alert("Error occurred: " + error.message);
   return false;
};
window.addEventListener("error", function (e) {
   alert("Error occurred: " + e.error.message);
   return false;
})

Ви також можете зафіксувати всі помилки, випущені під час .then()прослуховування unhandledrejectionподії обіцянки ( )

window.addEventListener('unhandledrejection', function (e) {
  alert("Error occurred: " + e.reason.message);
})

1
Чи потрібно використовувати і те, window.onerrorі window.addEventListener("error"чи достатнє використання одного з них?
Tormod Haugene

2
Ви можете використовувати один з них. Якщо ви використовуєте window.addEventListener("error", надішліть useCaptureнабір для trueтого, щоб також вловлювати помилки елементів, які не спливали. developer.mozilla.org/en-US/docs/Web/API/GlobalEventHandlers/…
Хав'єр Перес

1
Дякую!! errorПодія не ловив мою конкретну помилку. unhandledrejectionотримав це, хоча.
Джо

throw new Error('tja');не спійманий у останньому хромі при такому підході ...
OZZIE

1
@JavierPerez Я тестував за допомогою v80, що приєднав подію, і відразу після цього кинув помилку, і вона не була спіймана, також не потрапила синтаксична помилка.
OZZIE

1

Перевірте http://log4javascript.org, він заснований на Log4J. Якщо більша частина вашого коду загорнута в оператори try / catch для обробки винятків, ви можете використовувати цю бібліотеку як загальний інтерфейс для надсилання результатів у завжди доступне "діалогове вікно" або вікно реєстрації, яке може бачити ваш кінцевий користувач. Ви навіть можете мати кнопку, яка виконує window.print () для друку вмісту діалогового вікна на принтер або PDF. Удачі.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.