Как продолжить выполнение JavaScript при получении ошибок во время загрузки

Не уверен, что лучший способ сформулировать вопрос, но предположим, что вы используете jQuery для настройки различных вещей, например:

<script>

    function doSecond(){
        alert("Hi");
    }

    function dofirst(){
        var x = asdasd;
    }

    $(dofirst);
    $(doSecond);

</script>

Итак, представьте, что до и первая доза секунды полностью независимы. Если dofirst генерирует исключение, которое, конечно, будет, то doSecond никогда не сработает. Я понимаю, почему это происходит, но мне интересно, есть ли способ обойти это без необходимости оборачивать КАЖДЫЙ вид обработчика jQuery, который я хочу установить в try catch. Например, я бы предпочел не делать:

try{
 $(doFirst);
}
catch{
 //maybe log here?
}

try{
 $(doSecond);
}
catch{
 //maybe log here?
}

Теперь, если вам интересно, почему я хочу это сделать? Ну, возьмем, к примеру, код на странице, которую вы сейчас просматриваете:

<script type="text/javascript">
        $(function() {
            $('#title').focus(function() { $('#how-to-tag').hide(); $('#how-to-format').hide(); $('#how-to-title').fadeIn('slow'); });
            $('#wmd-input').focus(function() { $('#how-to-tag').hide(); $('#how-to-format').fadeIn('slow'); $('#how-to-title').hide(); });
            $('#tagnames').focus(function() { $('#how-to-tag').fadeIn('slow'); $('#how-to-format').hide(); $('#how-to-title').hide(); });
        });
    </script>

Действительно ли необходимо, чтобы некоторые элементы dom исчезали при нажатии на них? Нет. Но если вы допустите ошибку в этой функции, то вполне возможно, что другой javascript, который вам действительно нужно запустить, может никогда не получить настройки.

2 ответа

Решение

Несколько способов убедиться, что все работает независимо друг от друга:

  • Как вы сказали, попробуйте / поймать вокруг каждого

  • Вызывайте каждый из них в setTimeout (или для этого нужен синтаксический сахар jQuery)

  • Разделить на разные <script>блоки

Очевидно, что никогда не выбрасывать исключение - нелепое предложение. Особенно в мире много браузеров / версий / серверов вверх / серверов вниз. Существует множество способов взломать сайт JS, так что трудно найти сайт любого размера, который не исключение какого-либо типа (при рассмотрении консоли).

Вы можете создать простую оболочку (или расширить существующие методы jQuery)

function safeonload(fn){
   $(function(){
     try{
       fn();
     }catch{
        //log?
     }
   });
 }

 safeonload(doFirst);
 safeonload(doSecond);
Другие вопросы по тегам