Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   обработка исклучений (https://javascript.ru/forum/misc/23119-obrabotka-iskluchenijj.html)

float 12.11.2011 21:44

обработка исклучений
 
2 варианта:

1-й
function a(node) {
 var t = node.firsChild;
}

2-й
function a(node) {
 if(node) var t = node.firsChild;
 else throw Error('node is undefined');
}


я пришёл к выводу, что 2-й вариант - только захламление кода, тк 2-м способом мы просто добиваемся того что в консоли показывает ошибку в другой строке.

Может я чегот не знаю, что должно было меня склонить ко второму варианту? (видел многие используют)

DreamTheater 12.11.2011 21:50

В приведенном Вами примере применение эксепшна действительно бессмысленно, но это не означает что они вовсе не нужны.

trikadin 12.11.2011 21:54

Цитата:

Сообщение от float
исклучений

ИсклЮчений!

float 12.11.2011 21:57

Цитата:

но это не означает что они вовсе не нужны.
ну пример просто ради примера.
у меня в коде эксепшены остались только в очень больших функциях. И закоменчены для дебагинга(например если extend переписывает сущ св-во).

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

Цитата:

ИсклЮчений!
очепятка

trikadin 12.11.2011 22:00

Цитата:

Сообщение от float
очепятка

Поэтому не минус)

DreamTheater 12.11.2011 22:03

Предположим есть функция которая вычисляет цену товара с учетом НДС:
function calcPrice(basePrice) {
    return basePrice * 1.2;
}

Однако даже если предположить что передаваемый в нее параметр basePrice всегда является числом, то есть ситуации когда параметр будет невалиден, например, если цена отрицательная. В таком случае функция отработает нормально, но полученный результат будет некорректен и все последующие операции с этим результатом будут бессмысленны. Таким образом необходимо остановить выполнение скрипта. В этой ситуации можно применить исключение, которое будет уведомлять об ошибке:
function calcPrice(basePrice) {
    if (basePrice < 0) {
        throw 'Price can not be negative.';
    }

    return basePrice * 1.2;
}

Теперь при вводе отрицательной цены скрипт остановится и в консоль выведется сообщение об ошибке, в противном случае мы бы получили отрицательный результат (без ошибки) и это привело бы к фейлу всех дальнейших расчетов. Если приложение большое, то поиск места в котором возникает ошибка мог бы занять достаточно значетельное время.

ksa 12.11.2011 22:05

float, если твой вопрос ограничивается только работой с параметрами функции и некоего общего подхода...
Мы у себя используем следующий вариант.

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

function a(node,type) {
   type=type || true;
}

ksa 12.11.2011 22:09

DreamTheater, теперь понятно о чём вопрос.

Применяем такое только в самых "труднодоступных" местах. Для выявления охайников, которые так умудряются запутать алгоритм движка, что только таким образом остановив выполнеие скрипта/программы можно по стеку ошибки вычислить охайника и привести его алгоритм к путёвому виду. :)

DreamTheater 12.11.2011 22:11

Цитата:

Сообщение от ksa (Сообщение 136091)
float, если твой вопрос ограничивается только работой с параметрами функции и некоего общего подхода...
Мы у себя используем следующий вариант.

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

function a(node,type) {
   type=type || true;
}

+1 Если допустимы некие умолчания при некорректных входных данных, то просто исправляем их и скрипт работает дальше, но иногда правильная информация на входе просто must have.

DreamTheater 12.11.2011 22:14

Например вот так:
function calcPrice(basePrice) {
    if (typeof(basePrice) !== 'number') {
        throw 'Price must be a number.';
    }

    if (basePrice < 0) {
        basePrice *= -1;
    }

    return basePrice * 1.2;
}

trikadin 13.11.2011 00:32

DreamTheater, а если человек чисто случайно передал в вашу ф-цию строку с числовым значением? Ну, скажем, значение у input'а получил, и отдал без parseInt'а...

float 13.11.2011 00:51

Не, в моём случае нет никаких расчётов и структура плоская и понятная.
Цитата:

если твой вопрос ограничивается только работой с параметрами функции и некоего общего подхода...
речь как раз о функциях в который не передан node.
тоесть дать коду упасть(и тогда всё равно можно легко понять почему он упал) или обработать этот вариант и разжевать в консоли почему всё упало

DreamTheater 13.11.2011 01:05

Цитата:

Сообщение от trikadin (Сообщение 136102)
DreamTheater, а если человек чисто случайно передал в вашу ф-цию строку с числовым значением? Ну, скажем, значение у input'а получил, и отдал без parseInt'а...

Это уже детали, я лишь показал основную суть.

trikadin 13.11.2011 01:22

Цитата:

Сообщение от DreamTheater
Это уже детали, я лишь показал основную суть.

Ну, в принципе, да)

x-yuri 14.11.2011 08:20

т.е. получается надо использовать исключения либо по причине качества кода, либо чтобы долго не искать причину в большом проекте... Исправлять некорректные данные? Разве это не ведет к некачественному коду, если мы говорим о внутренних данных? В любом случае советы довольно нечеткие. Я например не понял, когда наступает must have, и насколько полный этот must have. В каких конкретно случаях их использовать, в каких не использовать. Проверять все параметры или выборочно. Насколько тщательно их проверять. Понял только основную суть: бывает нужно :)

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

ksa 14.11.2011 08:37

Цитата:

Сообщение от x-yuri
т.е. получается надо использовать исключения либо по причине качества кода

У нас получается, что так. На данный момент их в движке осталось 3. Одно контролирует дату, остальные два контролируют структурные моменты...

Правда оговорюсь, это не JS программки. Но этот подход я бы примени и к JS... Поскольку пока не вижу в чём-то другом особого смысла в прерывании программы именно по "своей ошибке", а не ошибке исполнения...

x-yuri 14.11.2011 11:16

Цитата:

Сообщение от ksa
У нас получается, что так. На данный момент их в движке осталось 3. Одно контролирует дату, остальные два контролируют структурные моменты...

3 вида исключений или 3 места, где генерируется исключение? И как вы определились с этими местами?

ksa 14.11.2011 11:23

Цитата:

Сообщение от x-yuri
3 вида исключений или 3 места

3 места... :) Ну и 3 разных сообщения при прерывании...
Цитата:

Сообщение от x-yuri
И как вы определились с этими местами?

Выявили самое "остриё" и там поставили анализ+прерывание. Пример кода тут мало чего даст, т.к. он не на JS (как я уже писал)...


Часовой пояс GMT +3, время: 07:51.