Hej! Av någon underlig anledning så alstras det inget fel vid kod nedan Överhuvudtaget så fungerar ingen felhantering i Delphi på min burk. Hej För det första, används inte variablerna kan koden optimeras bort(berorende på vilka kompilator inställningar du gjort). Tack för denna utförliga information, Q. >Däremot genereras inget Exception när jag kör koden inuti Delphi. Nu blev jag lite osäker om jag postade rätt kod eller inte... hmm konstigt. Jag får exception i båda fallen. Tack för tipset!Problem med felhantering
Jag håller på att testa en felhanteringsrutin i Delphi.
Får inte detta till att fungera:
var a:double;
begin
try
a := 6 / 0;
except
Showmessage('division med noll');
end;
end;
Vad är det för fel?Sv: Problem med felhantering
Try aktiveras aldrig.
var a:Single;
begin
a := 6 / 0;
Showmessage('division med noll');
end;
/SvenSv: Problem med felhantering
Har provat med alla möjliga "try..except"-exempel jag plockat från nätet.
Någon inställning i Delphi 6 som jag missat, kanske???Sv: Problem med felhantering
Kör Delphi 5 ,samma där,himla märkligt
division med 0(Noll) borde vara det säkraste testet.
Logga in någon expert och red ut problemmet.
/SvenSv: Problem med felhantering
// Genererar inget exception eftersom a aldrig används
var
a: double;
b: integer;
begin
b := 0;
a := a / b;
end;
//Men nu skapas ett exception eftersom a används
var
a: double;
b: integer;
begin
b := 0;
a := a / b;
ShowMessage(FloatToStr(a));
end;
Ditt exempel genererar nog inget exception pga att a räknas ut vid kompilerigen och blir en konstant satt till INF(Infinity), .
var a:double;
begin
try
a := 6 / 0;
except
Showmessage('division med noll');
end;
ShowMessage(FloatToStr(a));//Visar antagligen att a är satt till INF
end;
Stänger man av exceptions vilket ibland görs vid krävande flyttalsoperationer så...
var
a: double;
begin
Set8087CW(Default8087CW or $3F);//Ser till så att inga exceptions skapas
try
a := a / 0;
except
ShowMessage('fel');
end;
ShowMessage(FloatToStr(a));//Visar INF
a := 0 / 0;
ShowMessage(FloatToStr(a));//Visar Nan
end;
Mer att läsa om Infinity NAN och andra roliga saker ;-).
http://homepages.borland.com/efg2lab/Mathematics/NaN.htmSv: Problem med felhantering
Jag upptäckte att ett Exception genereras med nedanstående kod när jag kör exe-filen ensam, alltså utanför Delphi.
var a:double;
begin
try
a := 6 / 0;
except
Showmessage('division med noll');
end;
ShowMessage(FloatToStr(a));//Visar antagligen att a är satt till INF
end;
Däremot genereras inget Exception när jag kör koden inuti Delphi.
Kan man dra slutsatsen att när exe-filen är kompilerad och körs av sig själv så fungerar felhanteringen, inte annars?
Lite konstigt, tycker jag...Sv: Problem med felhantering
Tja koden genererar inga exceptions på min dator Delphi 5 och Delphi 7 varken i Delphi eller utanför. Antar att detta beror på att a blir en konstant vid kompileringen så det kommer inte att utföras någon division i runtime.
uses
Math;
const
b = 1.0 / 0.0;
var
a:double;
begin
if IsInfinite(b) then
Showmessage('b = infinite value');
a := 6 / 0;
if IsInfinite(a) then
Showmessage('a = infinite value');
end;
>så fungerar felhanteringen, inte annars?
Tycker det är lite konstigt att du får exceptions med exemplet. Felet borde isåfall uppstå vid kompileringen.
Tex genererar detta ett fel vid kompilering:
var
a: integer;
begin
a := 1 div 0;
end;
Men används flyttal så blir a istället INF(Infinity=ändlös).
>Lite konstigt, tycker jag...
Flyttal är lite konstiga :-)
Jag är inte så hemma på detta därav blir nog min förklaring lite dålig.
Något som du kan kolla är inställningarna för debuggern (Menyn Tools -> Debugger options) där kan du ställa hur debuggern ska hantera exceptions.Sv: Problem med felhantering
Hur-som-helst...med denna kod får jag ett Exception när jag kör exefilen ensam, men inte i Delphi...
<code>
var
a,b,c:integer;
begin
a := 8;
b := 9;
c := 0;
try
a := b div c;
edit1.Text := inttostr(a);
except
on EZeroDivide do
showmessage('division med noll');
end;
end;
</code>
Jag tittade lite i Debugger Options och där finner jag ju en del inställningar. Jag har emellertid aldrig ändrat i någon av dessa så mina inställningar är enligt standard.Sv: Problem med felhantering
Du ska använda EDivByZero istället för EZeroDivide om du vill visa ett eget felmedellande. Som koden är nu kommer du inte fånga felet(b div c) .Sv: Problem med felhantering
Med EZeroDivide uppenbarar sig en ruta med engelsk text (division by zero). Bättre då att använda EDivByZero som du föreslog.
Alltid lär man sig något nytt...