| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > JavaScript: для новичков > Функция throw() - как пользоваться ? |
| Автор: BugZZ 26.1.2010, 16:07 | ||
| привет всем! вот уже который день пытаюсь разовбраться с этой функцией. Да-да на многих ресурсах написано черным по белому "throw() - генерирует (быьрасывает) исключения"..Вот только что за исключения. что именно кроется за этим словом? Да я знаю что исключения нужны для try/catch..но все примеры которые я пока видел - меня все никак не просветлят. вот один из них из http://www.ozon.ru/context/detail/id/2820553/
Проверка такая: от сервера должно прийти случайное число от 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 |
| Это целиком на усмотрении программиста : ). Может сообщить там, где её нет, а может не сообщать ("вы вольны быть злодеем", см. док. по народным и ненародным сказкам, там эта тема подробно раскрывается). Но смысл примера по 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 {код ошибки}, но не всегда это правильно: во первых функция возможно уже должна возвращать нормальные значения, а во вторых мы можем вдруг захотеть обработать конкретную ошибку уже в другом месте (которое находится раньше функции Б в стеке вызовов. |