locator
Постоялец
Offline
|
|
« : 09-11-2007 22:57 » |
|
Доброго времени суток! Почему не перехватывается такое исключение: try { double c = sqrt(-2); } catch(Exception &x) { ShowMessage("Error: " + x.Message); }
Появляется окно с сообщением о нарушении диапазона функции sqrt. Или исключения функций по-другому ловятся? Спасибо за ответ!
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #1 : 10-11-2007 07:51 » |
|
locator, пробуй так try { double c = sqrt(-2); } catch(Exception &x) { ShowMessage("Error: " + x.Message); } catch(...) { ShowMessage("Error:"); }
если кинуто исключение класса , не указанного в скобках , то в троеточии поймается всё остальное
|
|
|
Записан
|
|
|
|
Finch
Спокойный
Администратор
Offline
Пол:
Пролетал мимо
|
|
« Ответ #2 : 10-11-2007 08:51 » |
|
По идее говоря, фкнция sqrt из библиотеки math.h не должна вызывать исключение. У меня в справочнике по этой функции написано, только, что она вызывает ошибку. Так что, правильнее, скорее всего, просто проверять аргумент перед вызовом самой функции.
|
|
|
Записан
|
Не будите спашяго дракона. Джаффар (Коша)
|
|
|
zubr
Гость
|
|
« Ответ #3 : 10-11-2007 13:21 » |
|
locator, а у тебя в IDE отключена остановка на исключениях?
|
|
|
Записан
|
|
|
|
locator
Постоялец
Offline
|
|
« Ответ #4 : 10-11-2007 19:33 » |
|
locator, а у тебя в IDE отключена остановка на исключениях?
ага, исключения Delphi и C++ отключены
|
|
|
Записан
|
|
|
|
locator
Постоялец
Offline
|
|
« Ответ #5 : 10-11-2007 19:36 » |
|
если кинуто исключение класса , не указанного в скобках , то в троеточии поймается всё остальное
ничего не ловится в троеточии, похоже нет исключения. Но тогда что это такое - появляется окно с надписью "sqrt: DOMIAN error!". Если на нуль делишь - исключение нормально ловится.
|
|
|
Записан
|
|
|
|
locator
Постоялец
Offline
|
|
« Ответ #6 : 10-11-2007 19:38 » |
|
По идее говоря, фкнция sqrt из библиотеки math.h не должна вызывать исключение. У меня в справочнике по этой функции написано, только, что она вызывает ошибку. Так что, правильнее, скорее всего, просто проверять аргумент перед вызовом самой функции.
Похоже нет исключения. А ошибки не перехватываются блоком try?
|
|
|
Записан
|
|
|
|
Джон
просто
Администратор
Offline
Пол:
|
|
« Ответ #7 : 11-11-2007 00:42 » |
|
Ну я на вас удивляюсь. Есть исключение, нет исключения... А что Finch сказал - всё мимо ушей. А самим в доки заглянуть?
sqrt ( -0 ) returns -0. sqrt ( x ) returns a NaN and generates a domain error for x < 0.
Ну и чего тут гадать?
|
|
|
Записан
|
Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома. "Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash "Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman "All science is either physics or stamp collecting." Ernest Rutherford "Wer will, findet Wege, wer nicht will, findet Gründe."
|
|
|
zubr
Гость
|
|
« Ответ #8 : 11-11-2007 06:54 » |
|
Джон, дело в том, что речь идет о работе данной функции в Borland. Не факт, что в билдере будет использоваться функция из майкрософтовской библиотеки (CRT или STD). К сожалению, у меня под рукой билдера нет. По крайней мере в Delphi используется собственная реализация данной функции, а в билдере зачастую используются дельфийские модули (кстати в Delphi данное исключение прекрасно отрабатывается).
|
|
|
Записан
|
|
|
|
locator
Постоялец
Offline
|
|
« Ответ #9 : 11-11-2007 11:00 » |
|
В билдере сказано, что если x<0 то переменная errno устанавливается в EDOM, так что делаю такой вариант: double c = sqrt(-2); if(errno == EDOM) ShowMessage("Error!!!");
Мое окно "Error!!!" появляется только при закрытии системного окна с ошибкой. А как сделать, чтобы системное окно вообще не появлялось?
|
|
|
Записан
|
|
|
|
Джон
просто
Администратор
Offline
Пол:
|
|
« Ответ #10 : 11-11-2007 21:59 » |
|
zubr, для этого есть стандарт. Причём тут Дельфи? locator, нууу, а если внимательно перечитать сообщение Finchа, не побояться и таки сделать проверку аргумента перед вызовом ф-ции sqrt?
|
|
|
Записан
|
Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома. "Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash "Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman "All science is either physics or stamp collecting." Ernest Rutherford "Wer will, findet Wege, wer nicht will, findet Gründe."
|
|
|
locator
Постоялец
Offline
|
|
« Ответ #11 : 11-11-2007 22:58 » |
|
locator, нууу, а если внимательно перечитать сообщение Finchа, не побояться и таки сделать проверку аргумента перед вызовом ф-ции sqrt? Ну это решает все проблемы. Можно перед каждой операцией проверять корректность всех параметров. Только не всегда это просто (ну например, когда преобразование строк в числа и обратно), поэтому применяют перехват исключений. Я просто думал, что исключение генерится при любой неверной операции.
|
|
|
Записан
|
|
|
|
locator
Постоялец
Offline
|
|
« Ответ #12 : 11-11-2007 23:01 » |
|
кстати в Delphi данное исключение прекрасно отрабатывается
а как это в дельфи оно отрабатывается, а в билдере нет? ведь у них одинаковые библиотеки
|
|
|
Записан
|
|
|
|
Джон
просто
Администратор
Offline
Пол:
|
|
« Ответ #13 : 11-11-2007 23:55 » |
|
Только не всегда это просто В данном случае как раз очень просто - гораздо проще огорода с исключениями. Лень, лень - матушка. (ну например, когда преобразование строк в числа и обратно), поэтому применяют перехват исключений. Ну всё намешал в одну кучу. Причём здесь преобразование в строку и обратно и ф-я sqrt? Лови исключение там. А в sqrt передаётся числовой параметр. У тебя компилятор не будет компилить если ты в неё строку передашь. ps Просто замечательный пример. А то я что-то в последнее время стал замечать, что простой проверке предпочитают исключения. Ещё бы всё просто. Взял в скобки - чего-нить да и поймается. ИМХО исключения надо использовать в исключительных случаях, когда уже ничего другого не остаётся. К тому же код с исключениями читать и разбираться в нём гораздо сложнее. Даже самому... спустя пару лет.
|
|
|
Записан
|
Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома. "Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash "Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman "All science is either physics or stamp collecting." Ernest Rutherford "Wer will, findet Wege, wer nicht will, findet Gründe."
|
|
|
Джон
просто
Администратор
Offline
Пол:
|
|
« Ответ #14 : 11-11-2007 23:58 » |
|
Ну и если уж тебе так хочется, чтобы исключение выскакивало сделай свою ф-ю
double mysqrt(double val) { if(val>0) return sqrt(val); throw(<какое хочешь иключение>); }
|
|
|
Записан
|
Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома. "Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash "Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman "All science is either physics or stamp collecting." Ernest Rutherford "Wer will, findet Wege, wer nicht will, findet Gründe."
|
|
|
zubr
Гость
|
|
« Ответ #15 : 12-11-2007 07:45 » |
|
Джон, какой стандарт и кто его устанавливал, мелкомягкие? Если бы это была функция API - тогда другое дело. Не могу посмотреть как в билдере (после переустановки системы не устанавливал, нет надобности), но в Delphi своя реализация данной функции в модуле System, причем скрытая. а как это в дельфи оно отрабатывается, а в билдере нет? ведь у них одинаковые библиотеки Вот код на Delphi: procedure TForm1.Button1Click(Sender: TObject); var d:double; begin try d:=sqrt(-4); except on e:Exception do MessageBox(0, PChar(e.Message), '', MB_OK); end; end; Выскакивает MessageBox с текстом: "Invalid floating point operator".
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #16 : 12-11-2007 08:14 » |
|
хм, а при чём тут плавающая точка
|
|
|
Записан
|
|
|
|
zubr
Гость
|
|
« Ответ #17 : 12-11-2007 10:20 » |
|
Следует понимать, как ошибка в данных с плавающей запятой (действительный тип).
|
|
|
Записан
|
|
|
|
Finch
Спокойный
Администратор
Offline
Пол:
Пролетал мимо
|
|
« Ответ #18 : 12-11-2007 12:05 » |
|
Джон, какой стандарт и кто его устанавливал, мелкомягкие? Если бы это была функция API - тогда другое дело.
zubr, Тут твоя ошибка. Есть специальная рабочая группа стандартизации C++ при Американском институте стандартов. Они выпускают через определенное время книженцию, стандарта С++. По слухам это кирпич килограмма на 3. Вот например Draft версия за ноябрь 1996 года. http://www.csci.csusb.edu/dick/c++std/cd2/index.html Если поискать, то можно найти версию и по свежее. Каждый производитель компилятор старается придерживаться стандарта. Хотя не всегда и получается.
|
|
« Последнее редактирование: 12-11-2007 12:07 от Finch »
|
Записан
|
Не будите спашяго дракона. Джаффар (Коша)
|
|
|
Джон
просто
Администратор
Offline
Пол:
|
|
« Ответ #19 : 12-11-2007 12:41 » |
|
Джон, какой стандарт и кто его устанавливал, мелкомягкие? Если бы это была функция API - тогда другое дело.
Блин как всё запущено... Причём здесь мелкомягкие? Что под никсом sqrt нет? Или под МАСом? Интересно как там под С++ вычисляют корни? Есть стандарт языка С++, у него есть стандартные библиотеки. Ещё раз подчёркиваю стандарт ЯЗЫКА!!! Те любой компилятор C++ должен его придерживаться. Причём здесь платформозависимый программный интерфейс - упомянутый тобой АПИ? Это всё равно, что говорить что switch-case под виндой работает не так как под никсом. Казалось бы, причём здесь Дельфи?
|
|
|
Записан
|
Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома. "Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash "Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman "All science is either physics or stamp collecting." Ernest Rutherford "Wer will, findet Wege, wer nicht will, findet Gründe."
|
|
|
|