Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: почему не ловится исключение  (Прочитано 23043 раз)
0 Пользователей и 1 Гость смотрят эту тему.
locator
Постоялец

ru
Offline Offline

« : 09-11-2007 22:57 » 

Доброго времени суток!
Почему не перехватывается такое исключение:
Код:
try
  {
    double c = sqrt(-2);
  }
  catch(Exception &x)
  {
    ShowMessage("Error: " + x.Message);
  }
Появляется окно с сообщением о нарушении диапазона функции sqrt.
Или исключения функций по-другому ловятся?
Спасибо за ответ!
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline 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
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #2 : 10-11-2007 08:51 » 

По идее говоря, фкнция sqrt из библиотеки math.h не должна вызывать исключение. У меня в справочнике по этой функции написано, только, что она вызывает ошибку. Так что, правильнее, скорее всего, просто проверять аргумент перед вызовом самой функции.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
zubr
Гость
« Ответ #3 : 10-11-2007 13:21 » 

locator, а у тебя в IDE отключена остановка на исключениях?
Записан
locator
Постоялец

ru
Offline Offline

« Ответ #4 : 10-11-2007 19:33 » 

locator, а у тебя в IDE отключена остановка на исключениях?
ага, исключения Delphi и C++ отключены
Записан
locator
Постоялец

ru
Offline Offline

« Ответ #5 : 10-11-2007 19:36 » 

если кинуто исключение класса , не указанного в скобках , то в троеточии поймается всё остальное
ничего не ловится в троеточии, похоже нет исключения. Но тогда что это такое -
появляется окно с надписью "sqrt: DOMIAN error!". Если на нуль делишь - исключение
нормально ловится.
Записан
locator
Постоялец

ru
Offline Offline

« Ответ #6 : 10-11-2007 19:38 » 

По идее говоря, фкнция sqrt из библиотеки math.h не должна вызывать исключение. У меня в справочнике по этой функции написано, только, что она вызывает ошибку. Так что, правильнее, скорее всего, просто проверять аргумент перед вызовом самой функции.
Похоже нет исключения. А ошибки не перехватываются блоком try?
Записан
Джон
просто
Администратор

de
Offline 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
Постоялец

ru
Offline Offline

« Ответ #9 : 11-11-2007 11:00 » 

В билдере сказано, что если x<0 то переменная errno устанавливается в EDOM, так что делаю такой вариант:
Код:
  double c = sqrt(-2);
  if(errno == EDOM)
  ShowMessage("Error!!!");
Мое окно "Error!!!" появляется только при закрытии системного окна с ошибкой.
А как сделать, чтобы системное окно вообще не появлялось?
Записан
Джон
просто
Администратор

de
Offline 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
Постоялец

ru
Offline Offline

« Ответ #11 : 11-11-2007 22:58 » 

locator, нууу, а если внимательно перечитать сообщение Finchа, не побояться и таки сделать проверку аргумента перед вызовом ф-ции sqrt? Ага
Ну это решает все проблемы. Улыбаюсь Можно перед каждой операцией проверять корректность всех параметров. Только
не всегда это просто (ну например, когда преобразование строк в числа и обратно), поэтому применяют перехват
исключений. Я просто думал, что исключение генерится при любой неверной операции.
Записан
locator
Постоялец

ru
Offline Offline

« Ответ #12 : 11-11-2007 23:01 » 

кстати в Delphi данное исключение прекрасно отрабатывается
а как это в дельфи оно отрабатывается, а в билдере нет? ведь у них одинаковые библиотеки
Записан
Джон
просто
Администратор

de
Offline 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."
Джон
просто
Администратор

de
Offline 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".
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #16 : 12-11-2007 08:14 » 

хм, а при чём тут плавающая точка
Записан

zubr
Гость
« Ответ #17 : 12-11-2007 10:20 » 

Следует понимать, как ошибка в данных с плавающей запятой (действительный тип).
Записан
Finch
Спокойный
Администратор

il
Offline 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 » Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Джон
просто
Администратор

de
Offline 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."
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines