Lazarus 1.8.2 (2017.12.06.)
Letöltés

file try.. except... nem működik?

  • Gábor
  • Gábor profilkép
  • Adminisztrátor
  • Adminisztrátor
  • Hozzászólások: 401
  • Karma: 7
  • Köszönetek: 58

Gábor válaszolt a témára: try.. except... tipuskonverzióra nem működik?

Köszönet a visszajelzésért. Okos ember épp úgy tanul a saját hibájából, mint másokéból. Szerintem ez is egy ilyen eset. Másoknak is hasznos lehet a hibakeresésben ha hasonló helyzetbe keverednek.
Én megtartanám ezt a témát, de ha nagyon akarod törlöm.
#2293
  • robotech
  • robotech profilkép
  • Haladó fórumozó
  • Haladó fórumozó
  • Hozzászólások: 28
  • Köszönetek: 0

robotech válaszolt a témára: try.. except... tipuskonverzióra nem működik?

Én Kérek elnézést!

Ez egy katasztrófa! Figyelmetlen voltam, főként talán azért is,mert az IDE nem ugrik a hiba helyére, ha megáll hibával a program.

Az eljárásban, ahol a lentebbi konverzió futott van egy művelet

elteres:=abs(homers-strtofloat(form1.modules[lekermodulszam].curr_t))

ahol szintén Stringből Float-ba történik a konverzió, és természetesen ennél a stringnél is el kell játszani, hogy vajon a decimal point , vagy . Ez viszont kimaradt, főleg mivel korábbi verzióban egyezményesen ',' volt a decimal point...

Ilyen szempontból a fórum témája értelmét vesztette, hiszen nem a try... exceptnél volt a baj, esetleg érdemes lehet a témát megszüntetni?

Köszönöm a segítséget mindenesetre!
#2292
  • robotech
  • robotech profilkép
  • Haladó fórumozó
  • Haladó fórumozó
  • Hozzászólások: 28
  • Köszönetek: 0

robotech válaszolt a témára: try.. except... tipuskonverzióra nem működik?

A hibakezelést bevallom őszintén szinte mindíg kihagyom, kivéve ha a fellépő hiba tipusára szükségem van. (sok olyan programot írok, ami teljesen automatikusan fut, adatot gyüjt, monitoroz stb... adatbázisba tölt. Ilyen műveleteknél mindíg lekérem a hibatipust, és egy diagnosztikai fileba mentem. De amikor nincs rá szükségem, akkor előfordul, hogy az except-et üresen is hagyom.) Sehol nem szokott hibát okozni, hogy a hibakezelést nem végzem el.
Delphi tutorials szerint betettem a megfelelő idevágó hibakezelést:

nemsiker:=false;
try
homers:=strtofloat(temp);
except
on Exception : EConvertError do begin
write_diaglog('Sikertelen tipuskonverzio strtofloat:'+Exception.Message,'APPLICATION');
homers:=0;
nemsiker:=true;
end;
end;


Annyi változás most már van, hogy legalább az Except lefut (tegnap még nem volt hajlandó a diagnosztikai filebe se beleírni. Most beleír, azonban a hibaüzenet feldobja a képernyőre.


Diaglog:

2018. 04. 11. 9:08:08 - Alkalmazás elindul.
2018. 04. 11. 9:08:12 - Sikertelen tipuskonverzio strtofloat:"25.90" is an invalid float


A Debugger Settingst átnéztem, csatoltam, úgy van beállítva ahogy írtad.

Azonban továbbra sem ugrik oda a kérdéses sorra, ha Cancel-t nyomok a felugró ablakban...
#2291
Mellékletek:
  • Gábor
  • Gábor profilkép
  • Adminisztrátor
  • Adminisztrátor
  • Hozzászólások: 401
  • Karma: 7
  • Köszönetek: 58

Gábor válaszolt a témára: try.. except... tipuskonverzióra nem működik?

A hiba helyére kell ugrania a szerkesztőnek ha a hibaablakban a "Megszagítás" gombra kattintasz.

Tipp: Nézd meg a menüből indulva a "Projekt / Projekt beállításai / Fordító beállításai / Hibakeresés" lapon, hogy be vannak-e kapcsolva a következők:
- "Hibakeresési információk létrehozása a GDB számára (lassabb / nagyobb exe-méret)"
- "Sorszámok megjelenítése a futási hibák esetén (-gl)"
Ne legyen bekapcsolva a következő:
- "Szimbólumok eltávolítása a futtatható állományból (-Xs)"
#2290
  • Gábor
  • Gábor profilkép
  • Adminisztrátor
  • Adminisztrátor
  • Hozzászólások: 401
  • Karma: 7
  • Köszönetek: 58

Gábor válaszolt a témára: try.. except... tipuskonverzióra nem működik?

Elsőre egy kicsit félreértelmeztem a problémát (tudjuk be annak, hogy nem sokat aludtam mostanában)...

A lényeg, hogy a minden kivételt kezelni kell, annak típusa szerint vagy általánosan.
  nemsiker:=false;
  try
    homers:=strtofloat(temp);
  except
    on EConvertError do nemsiker:=true; // Itt és most bemutatásképpen csak az EConvertError típusú kivétel kezelése történik meg, minden más továbbra is fennálló hibaként "nyilván van tartva"
  end;
 
  if nemsiker then begin
    try
      temp:=stringreplace(temp, '.', ',',[rfReplaceAll, rfIgnoreCase]); //kicseréljük a . vesszőre
      homers:=strtofloat(temp);
    except
      on E:Exception do ShowMessage('Sikertelen string-szám konverzió hofokriasztaschk-nal'); // Itt és most bemutatásképpen minden hiba kezelése egyben történik és megjelenik a saját üzenet, de további problémákat az eddigi hibák már nem okoznak
    end;
  end;
A rfReplaceAll, rfIgnoreCase "flagok" ez esetben elhagyhatók, mivel se a pontnak se a vesszőnek nincs kis- és/vagy nagybetűs változata.

A kivételek kezelésével kapcsolatban olvasd el a FreePascal súgójának Exceptions című részét.
#2289
  • robotech
  • robotech profilkép
  • Haladó fórumozó
  • Haladó fórumozó
  • Hozzászólások: 28
  • Köszönetek: 0

robotech válaszolt a témára: try.. except... tipuskonverzióra nem működik?

Esetleg azt nem tudom, hogy valahol véletlenűl elállítottam volna valami fordítási direktívát, hogy ilyen tipuskonverziós esetekre nem érvényes a try-except?

Ami még a hibaüzenet érdekessége, hogy Debug alatt ugye amikor megáll hibával, akkor oda szokott ugrani az editor ahol megállt, most viszont nem látom / nem mutatja pontosan a sort, hogy hol állt meg...
(azonban tipuskonverziót csak egy eljárásban hívok meg, amely eljárásban mindkettő try..except ben van. ha az eljárást ki perjelezem // akkor a program lefut)
#2288
  • robotech
  • robotech profilkép
  • Haladó fórumozó
  • Haladó fórumozó
  • Hozzászólások: 28
  • Köszönetek: 0

robotech létrehozta a témát: try.. except... tipuskonverzióra nem működik?

Üdv!

Nem egy bonyolult dolgot szeretnék csinálni, de lefordítás után a program mindig hibát dob, akkor is, ha nem az IDE-ben indítom, hanem EXE-ként:

Try... except.. közé beírok egy string konverziót float-á. Ha nem tudná elvégezni, akkor a stringben lévő decimal pointot átalakítom vesszőre, mert ugye más más pc-ken ez a beállítás eltérő lehet.
De hiába van TRY... except-ben mégis mindíg hibát dob: "28.2 is an Invalid Float press ok to ignore, press cancel to kill the program". itt még az is vicces, hogy OK után sem folytatja a procedure lefutását amiben ez a pár sor benne van...

Mi lehet a baj? hogyan lehetne akkor ezt a feladatot megcsinálni?

(A temp és a hofok azok globális shortstringek)

var f : textfile;
homers : single;
elteres : single;
nemsiker: boolean;

temp:=hofok;

//a stringben kapott hőfokot átkonvertálnánk float-ra (single)
nemsiker:=false;
try
homers:=strtofloat(temp);
except
nemsiker:=true;
end;

if nemsiker then begin
try
temp:=stringreplace(temp, '.', ',',[rfReplaceAll, rfIgnoreCase]); //kicseréljük a . vesszőre
homers:=strtofloat(temp);
except
write_diaglog('Sikertelen string-szám konverzió hofokriasztaschk-nal','APPLICATION');
end;
end;


Köszönöm a segítéget előre is!
#2286