Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > JavaScript: для новичков > Функция throw() - как пользоваться ?


Автор: BugZZ 26.1.2010, 16:07
привет всем!
вот уже который день пытаюсь разовбраться с этой функцией. Да-да на многих ресурсах написано черным по белому "throw() - генерирует (быьрасывает) исключения"..Вот только что за исключения. что именно кроется за этим словом? Да я знаю что исключения нужны для try/catch..но все примеры которые  я пока видел - меня все никак не просветлят.

вот один из них из http://www.ozon.ru/context/detail/id/2820553/
Код

if(response.length > 3 || response.length == 0)
      throw(response.length == 0 ? "Server error" : response);

Проверка такая: от сервера должно прийти случайное число от 1 до 100. Поэту примитивная проверка проста: если равен 0 или длинна ответа больше 3 = ошибка. Ну с первым if-ом все ясно а вот зачем в нем второй (в короткой форме) да еще и с этой функцией....

ЗЫ. Код, что я написал - часть функции которая вызывается в try/catch поэтому то и используется throw(), но я все никак не пойму зачем еще одно условие ?
Может кто-нить объяснить на другом примере - зачем такая конструкция и какие за и против.

На некоторых англоязычных сайтах читал что мол эта throw помогает в дебагинге, особенно если нет firebug-а.

Автор: 12345c 26.1.2010, 16:56
Функция для эмуляции ошибки.
В случае с аяксом могли бы вывести и через обычное сообщение или пользовательскую errorFun('сообщение'). но так как смысл сообщения - ошибка, то даже если программных средств для её обработки нет, сделали эмуляцию, чтобы по тексту было ясно, что речь об ошибке и ловят её через catch(). Если нет catch(), вылетит ошибка браузера (по идее) с указанным пользовательским кодом (текстом).

Другой (прямой) способ использования.
если у Вас сложный расчёт, где возможна ошибка, но на тестах Вы не можете или не хотите получить, но хотите отладить вывод сообщения об ошибке (например, переменная в данной точке может превысить 999, а этого нельзя допускать) - нет ничего проще - пишете throw('Ошибка 999'); и доотлаживаете обработку этой ошибки в своём коде.

Автор: BugZZ 26.1.2010, 17:22
получается что throw эмулирует ошибку, точнее сообщение об ошибке с текстом "server error" или объектом response, независимо, есть ли на самом деле место этой ошибке или нет? Как я понял для этого и нужно первое условие, чтобы генерация ошибки сработала там и толоко там, где о ней нужно сообщить, в случаее ее возникновения...так или опять напутал ?

Автор: 12345c 26.1.2010, 18:42
Цитата(BugZZ @  26.1.2010,  17:22 Найти цитируемый пост)
... независимо, есть ли на самом деле место этой ошибке
Это целиком на усмотрении программиста : ). Может сообщить там, где её нет, а может не сообщать ("вы вольны быть злодеем", см. док. по народным и ненародным сказкам, там эта тема подробно раскрывается). Но смысл примера по ajax, наверное в том, что там ошибка сервера есть. (А у JS нет встроенных средств о её оповещении, нет события Error на неприход ответа или на код 404 и на что-либо ещё в связи с объектом XMLHttpRequest.)

Автор: BugZZ 26.1.2010, 19:13
А можно какой-нить пример, на котором я бы окончательно уяснил особоеность/полезность этой функции ? Что-то с и без функцией. чтоб уж точно понял разницу между а и б ....А то все пока накаком-то абстрактном уровне.  

UPDATE:
Я вот просто тут на http://www.w3schools.com/js/js_throw.asp и честно говоря не совсем пойму зачем все так сложно. Может за этим и кроется что-то благородное, но подобные стать (а их много) только столку сбивают, поэтому и прошу како-йнить стоящий пример  

Автор: segrey 27.1.2010, 03:14
Смысл в том, чтобы отделить обработку ошибок от того места, где устанавливается сам факт наличия ошибки. Пример по ссылке кривоватый, не стоит делать try catch в одной функции где все throw и вызываются, там можно обойтись и простым if ом. 

Но если ошибка происходит в функции А, а обработать её надо в функции Б (когда функция Б вызывает функцию А), тут на помощь и приходят исключения. Конечно функция А может сделать что - то вроде return {код ошибки}, но не всегда это правильно: во первых функция возможно уже должна возвращать нормальные значения, а во вторых мы можем вдруг захотеть обработать конкретную ошибку уже в другом месте (которое находится раньше функции Б в стеке вызовов.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)