JQuery обработка исключений - PullRequest
3 голосов
/ 21 июня 2010

Есть ли способ, которым я мог бы поймать любое неперехваченное исключение в javascript?Я имею в виду, что весь мой «опасный» код находится в блоках try-catch.Но как насчет исключений, которые я не обрабатываю явно?Я использую jQuery, мой основной файл javascript начинается с:

$(document).ready(function(){})

здесь я связываю некоторые события с некоторыми элементами DOMЯ могу использовать блоки try-catch здесь, но они будут перехватывать исключения, возникающие во время процедуры привязки события, а не во время обработки события.Но если бы я использовал блоки try-catch в каждой функции обработки событий, это было бы ужасно.

Как мне перехватывать исключения, которые не встречаются в моих явных блоках try-catch?(Я не хочу писать общую функцию-обработчик, я просто хочу отправить проблему на мой сервер)

Ответы [ 3 ]

5 голосов
/ 21 июня 2010

Вы можете написать функцию, которая обернет ваши настоящие обработчики в try / catch

function tc(func, msg) {
  msg = msg || "Handler exception";
  return function(e) {
    try {
      return func(e);
    }
    catch (exc) {
      $.post( /* send exception to server? */ );
      throw exc; // let nature take its course
    }
  };
}

(Возможно, вы захотите стать более искусным с обработкой аргументов и т. Д.) Затем, когда вы связываете обработчики, вы делаете:

$('#whatever').click(tc(function(e) {
  // your handler function
}, "This is the message sent to the server when this handler fails"));

Кроме того, если вы хотите убедиться, что "this" в обработчике ведет себя как прежде, вы можете сделать func.apply($(this), e) вместо func(e).

3 голосов
/ 21 июня 2010

Вы можете использовать обработчик событий window.onerror, хотя он не поддерживается в Opera и может не срабатывать в определенных ситуациях (спасибо @Josh).

Это не очень разумно делать, однако, это приведет к ошибке при поиске кошмара для начала. Как правило, лучше всего сначала убедиться, что ваш код не содержит ошибок :-) Вам, конечно, не нужно очень часто использовать операторы try... catch в JavaScript, и определенно не следует использовать пустые блоки catch.

Я могу использовать блоки try-catch здесь, но они будут перехватывать исключения, которые произошли во время процедуры привязки события, а не во время обработки события.

Вы также можете добавить блоки try / catch во внутренние области:

// Outer
try { 
    $(document).ready(function(){})
}
catch (e) {
    /* Error handling */
}

// Inner
$(document).ready(function(){
    try { /* ... */ } catch (e) { /* Error handling */ }
});
1 голос
/ 21 июля 2015

Как насчет

    function func_madness() {
        throw("This function is throwing exceptions, because \n" +
        "it can not throw polar bears and whales.\n");
    } // func_madness

    window.onload = function () {
        try {
            func_madness();
        } catch (err) {
            document.write("Caught it!\n<br/>\n" + err);
        } // catch
    } // window.onload
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...