Для пользователей, которые регистрируются. Если Вам не приходит письмо с подтверждением email, пишите на admin[at]quizful[dot]net - будем подтверждать вручную. Просим прощения за доставленные неудобства.

С уважением,
команда Quizful
Знаете ли Вы, что

Список полученных сертификатов находится на странице Вашего профиля. Сертификаты можно распечатать или разместить на Вашем сайте.

Топ контрибуторов
loading
loading
Лента обновлений
ссылка 18:56:00
Комментарий от vasilchenko:
Это не трудно, но мало кто мыслит в отличной от деся...
ссылка 18:28:37
Добавлен вопрос в тест Java - Основы
ссылка 18:14:25
Комментарий от asker:
молоток, возьми с полки пирожок.
ссылка 17:36:28
Комментарий от alex_skn:
korniltsev, Вы правы. Ответ к задаче исправил, спасибо ...
ссылка 17:26:36
Комментарий от Petr0:
Аналогично
Статистика

Тестов: 130, вопросов: 5785. Пройдено: 113088 / 461686.

Обработка исключений в JavaScript

head tail Информация о статье
категория
Веб технологии
дата19.06.2009
авторart
голосов0

Введение в обработку исключительных ситуаций

Удивительно, что большинство скриптов, написанных на JavaScript не производят вообще никакой обработки исключений. Конечно, Вы можете очень акуратно кодировать, но рано или поздно произойдёт что-то непредвиденное и Вы столкнетесь с исключениями. Объект Error, доступный с JavaScript версии 1.5, призван облегчить процесс обработки ошибок. Он реализован во всех современных браузерах (в Internet Explorer начиная с версии 5) и содержит ряд свойств, помогающих Вам отобразить понятные пользователю сообщения об ошибках или отладочную информацию, которая нужна для диагностики.

Блок try-catch в JavaScript ...

Синтаксис блока try-catch взят из языка программирования Java. Любая ошибка, сгенерированная кодом внутри try, запустит блок catch, тем самым позволяя совершить альтернативное действие или обработку ошибки. Как минимум это позволяет, просто отобразить пользователю какое-нибудь понятное для него сообщение. Синтаксис блока try-catch следующий:


try {
     // блок, в котором возможно появление ошибки
} catch (error) {
     // код обработки ошибки
}

В следующем примере функция eval() не сработает, потому что ей передается строка, не содержащая JavaScript-кода. Вместо того, чтобы позволять браузеру отображать загадочное сообщение об ошибке или вообще игнорировать ошибку, мы используем alert() для отображения понятного пользователю сообщения:


function safelyEval(script) {
    try {
        eval(script);
    } catch(e) {
        alert('Произошла ошибка при выполнении скрипта: ' + script);
    }
}

safelyEval('some text');

... и finally.

Блок finally используется для безусловного выполнения фрагмента кода, независимо от того произошло исключение внутри блока try или нет. Это удобное место для размещения кода, который выполняет очистку (например, освобождение ресурсов).


try {
    A();
    // этот код выполнится, если вызов A() не сгенерирует исключение
    B();
} catch(e) {
    alert('Произошла ошибка');
    clean();
} finally {
    // этот блок выполняется независимо от того, что находится выше 
    // (если только начал выполнятся код блока try)
    C();
}

Имейте в виду, что не существует способа "отменить" выполнение блока finally, после того, как поток управления зашел в блокtry, даже используя оператор return. Поэтому избегайте подобного кода:


function someFunc() {
    try {
        if (true) {
            throw "Ошибка!";
        }
    } catch (e) {
        alert(e.message);
        return false;
    } finally {
        return true;
    }
}

Антипаттерны обработки исключений в JavaScript

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

Частичное скрытие информации об ошибке

Скрытие информации об ошибке, часто получается случайно путем повторного выбрасывания исключения с частично скопированной информацией. Например, в следующем коде, часть информации оригинальной ошибки будет потеряна (невозможно будет узнать какой оператора внутри try-catch сгенерировал исключение), потому что только текст ошибки будет сохранен и передан вверх по стеку вызова в виде объекта Error:


function parse(str) {
    try {
        var res = A(str);
        res = B(res);
        res = C(res);
    } catch(e) {
        throw new Error("Проблема: " + e.message);
    }
    return res;
}

Другим сомнительным подходом использования блока try-catch является игнорирование ошибки. Его характерной чертой является пустой или содержащий комментарий типа "ничего не делаем" или "игнорируем ошибку" catch блок. В следующем примере, автор определил, что отсутствие строки result не расценивается как ошибка. Чтобы избежать исключения, он сам делает проверки result в главном блоке кода и выходит из функции досрочно:


function parse(str) {
    var result = "";
    try {
        result = str.replace( /-/, "" );
        if (!result) return;

        // что-то делаем с result
        ...
    } catch(e) {
        // ничего не делаем
    }

    return result;
}

Несмотря на то, что автор пытается обработать все потенциальные иключения, будет сложно отладить код в случае возникновения непредвиденной ситуации, поскольку вызывающая сторона никоим образом не может получить информацию об ошибке. Другие проблемы этого кода в том, что:

  • оператор return без значения приведет к тому, что функция возвратит константу undefined. При этом вызывающая сторона ожидает, что возвращаемым типом должна быть строка. Предположим, что вызов parse выглядит следующим образом: parse(someString).indexOf("1");. Вы не можете вызывать методы объекта undefined, в то же время их вполне можно вызывать у пустой строки "". Следовательно, в данном случае разумнее возвращать пустую строку.
  • если catch-блок содержит много кода, то может быть очень тяжело определить строку, которая привела к исключительной ситуации.

Выводы

Правильная обработка исключений является важной составляющей умения кодировать. Игнорирование данного аспекта программирования часто приводит к разочарованию пользователя системы и потере времени разрабочика в будущем, поэтому нужно тщательно продумывать свои программы и никогда не откладывать обработку ошибок на потом.

Если Вам понравилась статья, проголосуйте за нее

Голосов: 0  loading...