![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Try..Except... [D6, Win95/98, WinXP]
wdr © (2002-07-23 08:23:00)Почему-то на двух компутерах (из 20) не поддерживается обработка исключительной ситуации при попытке деления на 0.
Подскажите, кто знает, в чем может быть причина. На одном из этих компов установлен проц Сел-333 и Win-98, на другом
Duron-850 и Win-98. Вот пример проги:
procedure TForm1.Button2Click(Sender: TObject);
var
X, Y, Z: real;
begin
X:=StrToFloat(Edit1.Text);
Y:=StrToFloat(Edit2.Text);
try
Z:=X / Y;
Edit3.Text:=Format("%15.2f", [Z]);
except
ShowMessage("!!! ERROR !!!");
Edit3.Text:="ERROR";
end;
end;
Проще некуда, но если делить на 0, то сразу "синий экран смерти",
хорошо, хоть перезагрузки не требуется.
Спасибо, Alex.
wdr (2002-07-26 07:17:00) [1]Благодарю всех за столь бурное обсуждение этой проблемы.
Вчера установил ХР на Duron и ни-каких проблем с делением на 0
не было. Советую всем, у кого аналогичная проблема, установить
XP (если позволяею ресурсы железа). Проблема не только в материнке с VIA. У меня на двух компах VIA-Appolo и Win-98,
все работает как надо. Это наверное "черная дыра", как в Бермудском треугольнике.
987 (2002-07-26 00:13:00) [2]Да, тут некоторые высказывали мнения, что нужно самому что-то там проверять. Так делать нельзя. Во-первых, всех случаев можно у не учесть. А Во-вторых, что самое главное, это-же очень медленно!!! Хорошо, если нужно проверить при вводе юзера. А если надо 1000 раз в секунду? Именно, что только try..except. Только как?
А это только на Дельфи? Если на каком нибудь VC++?
987 (2002-07-26 00:04:00) [3]О, у меня похожая проблема. Можете глянуть
<Просто кошмар!!! Ln(X), где X 0 вешает Win98>
VICTOR_ (2002-07-25 15:18:00) [4]>AlexanderVasjuk © (25.07.02 11:26)
>Подобная проблема знакома. Причем в целочисленной арифметике. >На Intel все нормально, на AMD - фатальный глюк глюк. Пришлось >ставить проверку на нуль, всё ОК.
Проблему решал аналогично
По опыту работы - проблема не в процессоре AMD + WIN98, а в материнке VIA + WIN98(напр. VIA KT133/A). К сожалению не могу сказать на всех ли новых VIA-материнках проявляется эта ошибка
>Менять материнки у всех юзеров накладно однако.
Согласен, но никто не гарантирует, что подобная ошибка не вылезет в другой аналогичной, но чужой, программе.
>AlSok (23.07.02 12:32)
Ты точно проверял на материнках с Intel-логикой или только были разные процессоры?
AlexanderVasjuk (2002-07-25 12:37:00) [5]wdr © (25.07.02 11:38)
Ну, если "смерть" тебя устраивает...
wdr (2002-07-25 11:38:00) [6]Проверку типа <<If Y <> 0 then...>> делать не собираюсь, т.к.
try ... except специально для этого и придумали. По поводу железа могу сказать следуещее: два абсолютно одинаковых компа, на одном Win-98, на другом XP. Проц:- Duron-850. Где 98 - смерть,
на ХР все O"k.
AlexanderVasjuk (2002-07-25 11:26:00) [7]Подобная проблема знакома. Причем в целочисленной арифметике. На Intel все нормально, на AMD - фатальный глюк глюк. Пришлось ставить проверку на нуль, всё ОК.
VICTOR_ (23.07.02 11:31)
Менять материнки у всех юзеров накладно однако.
МИФИст (2002-07-24 15:57:00) [8]procedure TForm1.Button2Click(Sender: TObject);
var
X, Y, Z: extended;
begin
X:=StrToFloat(Edit1.Text);
Y:=StrToFloat(Edit2.Text);
if Y=0 then
begin
ShowMessage("!!! ERROR !!!");
Edit3.Text:="ERROR";
Exit;
end;
Z:=X / Y;
Edit3.Text:=Format("%15.2f", [Z]);
end;
IlyaA (2002-07-24 14:14:00) [9]> Anatoly Podgoretsky - А ты попробуй.
Я пробовал перед тем как написал. В данном случае он выдёт INF при сл. выводеShowMessage(FloatToStr(a));
Ростопопулас (2002-07-24 14:03:00) [10]А железо одинаковое на этих компах или нет?
Anatoly Podgoretsky (2002-07-24 14:01:00) [11]IlyaA (24.07.02 09:52)
Ты думаешь это выполняется a:=1/0? Компилятор не настолько дурной.
Вячеслав (2002-07-24 13:52:00) [12]Никогда не делай >> проверку типа
If Y <> 0 then...
Никакого разумного результата не будет. Знаменатель надо сранивать не с нулем, а с малым числом, близким к нулю с нужной точностью. И не на равенство, а на больше/меньше.
И StrToFloat действительно нужно загнать в обработчик исключений.
IlyaA (2002-07-24 09:52:00) [13]Замечание:
Я провёл несколько эксперементов и замитил что если писать a:=b/0, то Exception Raised, а если писать a:=1/0, то нет.
AlSok (2002-07-23 12:32:00) [14]VIA zdes" ne prichem.
J proverjl raboty na samih raznih konfigyracijh, nachinaj s 600MGz pojvljetsj takaj oshibka.
Eto voznikaet ne tol"ko v slychae s deleniem na 0, no i pri perepolnenii float tipa, ymnojenie, fynkcij "power", ...;
Takje pri izvlechenii kornj iz NAN, v fynkcii "tan", "arctan" pri zadanii nedopystimih znachenii.
V svoe vremj ob etom pisali Borlandy, no on otmalchivalsj, a obnaryjili eto esche v Delphi4.
-----
Samii pravil"nii pyt" eto vsegda proverjt" na dopystimost" operacii i ne ispol"zovat" try-except.
VICTOR_ (2002-07-23 11:31:00) [15]>wdr © (23.07.02 08:23)
>Почему-то на двух компутерах (из 20) не поддерживается >обработка исключительной ситуации при попытке деления на 0.
Вероятно, у тебя материнка с VIA логикой. Сам сталкивался с такой проблемой.
Варианты решения
1.Поменяй материнку на Intel логику
2.Поставь WIN2000,NT,XP
3.Делай проверку типа
If Y <> 0 then
doomin (2002-07-23 09:49:00) [16]Такие серьезные аппаратные исключения лучше не обрабатывать а не допускать. Ресурсов это займет меньше... Можно просто проверить Y на предмет нуля. А StrToFloat настоятельно рекомендуется поместить в try..except
Lord Warlock (2002-07-23 09:36:00) [17]вообще-то неплохо StrToFloat поместить в try
kerberos (2002-07-23 09:22:00) [18]Посмотри какой на этих машинах установлен системный разделитель