Evo jedne zanimljive činjenice: Ne kodirati je bez grešaka - u stvari, neki je kôd namjerno pun „pogrešaka“.
Što je pogreška u aplikaciji? Pogreška je pogrešno kodirano rješenje problema. Takvi su logičke pogreške što bi moglo dovesti do pogrešnih rezultata funkcije, gdje se čini da je sve lijepo složeno, ali rezultat primjene je potpuno neupotrebljiv. S logičkim pogreškama, an primjena možda ili ne može prestati s radom.
Iznimke mogu uključivati pogreške u vašem kodu gdje pokušavate podijeliti brojeve s nulom ili pokušajte koristiti oslobođene memorijske blokove ili pokušati pružiti pogrešne parametre nekoj funkciji. Međutim, iznimka u aplikaciji nije uvijek greška.
Izuzeci i klasa izuzetaka
Izuzeci su posebni uvjeti koji zahtijevaju posebno rukovanje. Kada se dogodi uvjet tipa pogreške program pokreće iznimku.
Vi (kao pisac aplikacije) rješavat ćete iznimke kako biste aplikaciju učinili sklonijom pogreškama i odgovorili na izvanredne uvjete.
U većini slučajeva naći ćete se kao pisac aplikacija i ujedno i knjižničar. Stoga biste trebali znati kako izuzeti iznimke (iz svoje knjižnice) i kako se nositi s njima (iz vaše prijave).
Članak o rukovanje greškama i iznimkama pruža neke osnovne smjernice o tome kako se zaštititi od pogrešaka pomoću try / osim / end i pokušaj / end / end zaštićenih blokova da reagiraju na ili rješavaju izvanredne uvjete.
Jednostavan pokušaj / osim zaštitnih blokova izgleda:
probati
ThisFunctionMightRaiseAnException ();
osim// rukovati bilo kojim iznimkama koje su ovdje prikazane u ThisFunctionMightRaiseAnException ()
kraj;
ThisFunctionMightRaiseAnException može u svojoj implementaciji imati liniju koda poput
podići Iznimka. Kreiraj ('poseban uvjet!');
Izuzetak je posebna klasa (jedna od nekoliko bez T ispred naziva) definirana u jedinici sysutils.pas. SysUtils jedinica definira nekoliko potomaka iznimke posebne namjene (i tako stvara) hijerarhija klasa izuzetaka) poput ERangeError, EDivByZero, EIntOverflow itd.
U većini slučajeva, iznimke koje biste obradili u zaštićenom bloku probati / osim, ne bi bili iznimka (osnovna) klasa, ali neke posebne klase potomstva iznimke, definirane ili u VCL-u ili u knjižnici koja se nalazite korištenje.
Rukovanje iznimkama pomoću pokušaja / osim
Da biste uhvatili i obradili vrstu iznimke, konstruirali biste obradnik izuzetaka "on type_of_exception do". "Izuzetak ne" djeluje prilično kao klasična izjava slučaja:
probati
ThisFunctionMightRaiseAnException;
excepton EZeroDivide dobegin// nešto kad se dijeli s nulomkraj;
na EIntOverflow dobegin// nešto kada je prevelik izračun cijelog brojakraj;
elsebegin// nešto kada se podignu druge vrste izuzetakakraj;
kraj;
Imajte na umu da bi drugi dio uzeo sve (druge) iznimke, uključujući one o kojima ništa ne znate. Općenito, vaš kôd treba obraditi samo iznimke s kojima se zapravo znate rukovati i očekujete da će biti bačen.
Također, nikada ne smijete "jesti" izuzetak:
probati
ThisFunctionMightRaiseAnException;
osim
kraj;
Ako jedete iznimku, ne znate kako se nositi s iznimkom ili ne želite da korisnici vide izuzetak ili nešto između toga.
Kada obrađujete iznimku i trebate više podataka iz nje (nakon što je to instanca klase), a ne samo vrstu iznimke koju možete učiniti:
probati
ThisFunctionMightRaiseAnException;
excepton E: Izuzetak dobegin
ShowMessage (E.Message);
kraj;
kraj;
"E" u "E: Izuzetak" je privremena varijabla iznimke tipa navedena nakon znaka stupca (u gornjem primjeru osnovna klasa iznimke). Pomoću E možete čitati (ili pisati) vrijednosti objektu iznimke, poput dobiti ili postaviti svojstvo poruke.
Tko oslobađa izuzeće?
Jeste li primijetili kako su iznimke zapravo slučajevi klase koja silazi iz izuzetka? Ključna riječ povisuje primjerak klase iznimke. Što stvorite (iznimka iznimke je objekt), isto tako treba osloboditi. Ako (kao pisac knjižnice) stvorite instancu, hoće li je korisnik aplikacije osloboditi?
Evo Delphi magija: Rukovanje iznimkom automatski uništava objekt iznimke. To znači da će, kada upišete kôd u blok "osim / završiti", osloboditi memoriju iznimki.
Pa što će se dogoditi ako ThisFunctionMightRaiseAnException ustvari izuzme iznimku, a vi s njom ne postupate (to nije isto što i „jesti“)?
A što kada se broj / 0 ne obrađuje?
Kad se u vaš kôd baci neovlaštena iznimka, Delphi opet čarobno postupa s vašom iznimkom pokazujući dijalog s pogreškama korisniku. U većini slučajeva, ovaj dijaloški okvir neće pružiti dovoljno podataka za korisnika (i konačno vas) da shvati uzrok iznimke.
To se kontrolira od strane Delphijeve petlje poruka na najvišoj razini gdje svi iznimke se obrađuju globalnim objektom aplikacije i njegovom metodom HandleException.
Da biste rješavali iznimke na globalnoj razini i pokazali vlastiti dijalog koji je više prilagođen korisnicima, možete napisati kôd za TApplicationEvents. OnException obradnik događaja.
Imajte na umu da je globalni objekt aplikacije definiran u jedinici Obrasci. TApplicationEvents je komponenta koju možete koristiti za presretanje događaja globalnog aplikacijskog objekta.