Sign in Join
Wiki copytemporary

Exceptions/fi

English · Suomi

Poikkeukset

Free Pascal tukee poikkeuksia. Poikkeukset ovat hyödyllisiä virheiden käsittelyssä ja resurssien vuotojen välttämisessä. Muista kuitenkin, että poikkeuksilla on suorituskykyvaikutusta.

Virallinen dokumentaatio löytyy täältä: Reference guide chapter 17.

Oletuksena poikkeukset on pois käytöstä. Se voidaan valita käyttöön kun käytetään ObjFPC tai DELPHI kääntäjän moodia tai lisäämällä parametrin -Sx kääntäjän komentoriville. Tämä mahdollistaa try, raise, except ja finally varatut sanat käytettäväksi omassa koodissasi, mutta se ei salli poikkeuksia RTL:stä. Jotta RTL voi nostaa poikkeuksia sen sijaan, että se tuottaa ajonaikaisia virheitä, käytä ohjelman SysUtils-käännösyksikköä.

Poikkeusten kantaluokka Exception löytyy SysUtils 1 käännösyksiköstä. Kaikissa poikkeuksissa tulisi käyttää tätä luokkaa tai jotain siitä johdettua luokkaa.

SysUtils luo automaattisesti peruspoikkeusten kiinnioton, joten mikä tahansa muutoin jäänyt poikkeus näkyy ihmisen luettavissa muodossa, kun ohjelma päättyy. Luodaksesi luettavia callstacks omasta koodistasi pyydetyistä poikkeuksista, ei välttämättä lopeta ohjelmaa, voidaan käyttää SysUtils-functions ExceptAddr, ExceptFrames, ExceptFrameCount, and BackTraceStrFunc.

Esimerkit

Huomaa, että Pascal käyttää eri avainsanoja kuin jotkut muut kielet: raise vastaa throw:ta ja except vastaa catch:a. Myös kääntäjä on suunniteltu niin että valinnan mukaan kukin try-lohko voidaan yhdistää joko except tai finally-lohkoon, mutta ei molempiin samanaikaisesti. Jos tarvitaan sekä except että finally-lohkoa suojaamaan samaa koodia niin ne laitetaan sisäkkäin.

Virheiden käsittely

pascal
uses sysutils;

begin
  try
  // Tee jotain, joka saattaa mennä pieleen.
  except
    on E : Exception do begin
    // Yritä palauttaa tai näytä käyttäjälle virheilmoitus
    end;
  end;
end.

Resurssien siivoaminen

pascal
try
  // Tee jotain, joka saattaa mennä pieleen.
finally
  // Siivoa resurssi lopuksi (kutsutaan aina, myös poikkeus tilanteissakin).
end;

Poikkeusten vuoto

Finally-lohkot eivät aina tuhoa poikkeusolioita. Kaikki poikkeukset, jotka saavuttavat ohjelman "lopun". käynnistää muistivuodon varoituksen. Tällaisten poikkeusten kuluttamiseen voidaan käyttää ylimääräistä poikkeuslohkoa. Tämä koskee Delphi-yhteensopivuus.

pascal
begin
  try
    // Pääohjelma, jossa luodaan poikkeusolio.
  finally
    try
      // puhdistuskoodi.
    except
    end;
  end;
end.

Poikkeuksen nostaminen

pascal
raise Exception.Create('Jokin hyödyllinen kuvaus siitä, mikä meni pieleen');

Käytä omia erikoistuneita poikkeustyyppejä eri ongelmien ilmoittamiseen

pascal
type EMyLittleException = Class(Exception);

begin
  try
    raise EMyLittleException.Create('Foo');
  except
    on E : EMyLittleException do writeln(E.Message);
    on E : Exception do writeln('This is not my exception!');
    else writeln('This is not an Exception-descendant at all!');
  end;
end;

Poikkeusten uudelleen nostaminen

pascal
try
  // Tee jotain, joka voi mennä pieleen.
except
  // Yritä palauttaa tai näyttää käyttäjälle virhesanoma.
  if recoveredSuccessfully = FALSE then
    raise;
end;

Poikkeusluokat

Käännösyksikkö SysUtils määrittelee ja nostaa monia erityisiä poikkeusluokkia

Kun käännösyksikkö SysUtils on mukana ohjelmassa ja poikkeukset on otettu käyttöön, erilaisia runtime-virheitä muutetaan poikkeuksiksi. Prosessoritason keskeytykset, kuten SIGSEGV tai SIGFPU, jotka yleensä kääntyvät ajonaikaisvirheisiin, muutetaan myös poikkeuksiksi. Esimerkiksi run-time error 200 eli ajonaikainen virhe 200 (nollalla jako) muuttuu EDivByZero:ksi tai EZeroDivide:ksi, kun taas ajonaikainen virhe 216 (yleinen suojausvirhe, general protection fault) tulee EAccessViolation:ksi.

Parhaat käytännöt

Suorituskyky

Kääntäjän optimointitasot ei tuo paljon eroja poikkeuksiin. Kaikissa poikkeuslohkoissa on pieni määrä "kehyskoodia", jota ei voida optimoida. Toki on mahdollista, että kääntäjä tuottaa poikkeuskoodin, jolla on erilaisia suorituskykyvaikutuksia. FPC 3.0.4: sta lähtien oletuspoikkeusmekanismi käyttää standardia setjmp / longjmp-tyyliä. FPC tukee myös OS-järjestelmään perustuvaa strukturoitua poikkeuksenkäsittelyä; tämä on Win64: n oletusarvo, ja se voidaan ottaa käyttöön Win32: ssä (käännä kääntäjällä uudelleen$define TEST_WIN32_SEH). Muita mekanismeja tullaan todennäköisesti lisäämään FPC:hen tulevaisuudessa.

Jotta saadaan parempi tuntuma, mitä tapahtuu, kokeile pienen testiohjelman kirjoittamista ja kääntämistä -a -kytkimellä. Tämä tekee ihmisen luettavissa olevan assemblytiedosto.

Metodeita setjmp/longjmp koskevat huomautukset:

Lisäksi ihmisen luettavissa olevan callstackin luominen korotetusta poikkeuksesta käsittää aikaa vievän pinonsiirron ja merkkikäsittelyn.

Kuten sanottiin, että raskas koodin käsittely kyseisen kohdan ulkopuolella poikkeuksella yleensä ylittää niiden suorituskykyvaikutukset. Ei pidä tuntea pahaa siitä, että pystyy kirjoittamaan parempaa ohjelmakoodia.

Katso myös

Logging exceptions

Avoiding implicit try finally section

Exceptions vs Error codes - a situation where exceptions might be a danger in some code (see middle of this page)


From the Free Pascal wiki, page "Exceptions/fi", as it stood on 2022-08-06 after a change by Kai Burghardt, out of the wiki's dump of 2024-05-26. Copyright stays with the author who wrote it, according to the old wiki's Licensing page. If you have concerns about this material, message the admin.

Revision 1, last changed by WikiArchive .

Talk about this page

Nobody has opened a bench for this page yet. Sign in to open one.