Tu je zanimivo dejstvo: Ne Koda je brez napak - v resnici je neka koda namerno polna "napak".
Kaj je napaka v aplikaciji? Napaka je napačno kodirana rešitev problema. Taki so logične napake To bi lahko privedlo do napačnih rezultatov funkcij, kjer se zdi, da je vse lepo sestavljeno, vendar je rezultat uporabe popolnoma neuporaben. Z logičnimi napakami, an prijava morda ne bo mogel prenehati delovati.
Izjeme lahko vključujejo napake v kodi, pri katerih poskušate razdeliti številke na nič, ali pa poskusite uporabiti sproščene pomnilniške bloke ali poskusiti zagotoviti napačne parametre funkciji. Vendar izjema v aplikaciji ni vedno napaka.
Izjeme in razred izjem
Izjeme so posebni pogoji, ki zahtevajo posebno ravnanje. Ko se pojavi stanje napake, program sproži izjemo.
Vi (kot pisec vlog) boste obravnavali izjeme, da boste aplikacijo naredili bolj nagnjeno do napak in se odzvali na izjemne pogoje.
V večini primerov se boste znašli kot avtor in tudi knjižnični pisatelj. Zato bi morali vedeti, kako dvigniti izjeme (iz knjižnice) in kako ravnati z njimi (iz vaše vloge).
Članek o ravnanje z napakami in izjemami ponuja nekaj osnovnih smernic, kako se zaščititi pred napakami z uporabo poskusov / razen / konca in poskusi / končno / končno zaščitenih blokov, da se odzovejo na ali obvladujejo izjemne pogoje.
Preprost poskus / razen zaščitnih blokov je videti:
poskusi
ThisFunctionMightRaiseAnException ();
razen// obravnavajte vse izjeme, ki so bile tukaj postavljene v ThisFunctionMightRaiseAnException ()
konec;
ThisFunctionMightRaiseAnException ima lahko pri izvajanju vrstico kot
dvigniti Izjema. Ustvari ('poseben pogoj!');
Izjema je poseben razred (eden od nekaj brez T pred imenom), opredeljen v enoti sysutils.pas. Enota SysUtils definira več potomcev izjeme s posebnim namenom (in tako ustvarja hierarhijo razredov izjem), kot so ERangeError, EDivByZero, EIntOverflow itd.
V večini primerov izjeme, ki bi jih obravnavali v zaščitenem bloku poskusov / razen, ne bi bile izjema (osnovni) razred, vendar nekaj posebnega potomčevega razreda izjem, ki je opredeljen v VCL ali v knjižnici, ki ste z uporabo.
Ravnanje izjem z uporabo poskusov / razen
Če želite ujeti in obdelovati vrsto izjeme, bi ustvarili orodje za obdelavo izjem "on_ type_of_exception do". Izraz "izjemoma naredim" je precej podoben klasični izjavi primera:
poskusi
ThisFunctionMightRaiseAnException;
excepton EZeroDivide dobegin// nekaj pri deljenju z ničlokonec;
naprej EIntOverflow dobegin// nekaj, ko prevelik izračun celega številakonec;
elsebegin// nekaj, ko se dvignejo druge vrste izjemkonec;
konec;
Upoštevajte, da bi drugi del zajel vse (druge) izjeme, tudi tiste, o katerih nič ne veste. Na splošno bi morala vaša koda obravnavati samo izjeme, ki jih dejansko znate obvladovati in pričakujete, da jih boste zavrgli.
Prav tako nikoli ne smete "jesti" izjeme:
poskusi
ThisFunctionMightRaiseAnException;
razen
konec;
Če uživate izjemo, ne veste, kako ravnati z izjemo ali ne želite, da uporabniki vidijo izjemo ali kaj drugega vmes.
Ko ravnate z izjemo in potrebujete več podatkov (navsezadnje gre za primerek razreda), ne le vrsto izjeme, ki jo lahko storite:
poskusi
ThisFunctionMightRaiseAnException;
excepton E: Izjema dobegin
ShowMessage (E.Message);
konec;
konec;
"E" v "E: Izjema" je začasna spremenljivka izjeme tipa, določena za znakom stolpca (v zgornjem primeru osnovni razred izjem). Z uporabo E lahko berete (ali napišete) vrednosti objektu izjem, kot je pridobivanje ali nastavitev lastnosti sporočila.
Kdo osvobodi izjemo?
Ste opazili, kako so izjeme dejansko primeri razreda, ki izhaja iz izjeme? Ključna beseda dvig vrže primerek razreda izjem. Kaj ustvarite (primerek izjeme je predmet), tudi vi treba osvoboditi. Če (kot pisatelj knjižnice) ustvarite primerek, ga bo uporabnik aplikacije sprostil?
Tukaj je Delphi magija: Obravnava izjeme samodejno uniči predmet izjeme. To pomeni, da ko napišete kodo v blok "razen / konča", bo sprostil pomnilnik izjem.
Kaj se torej zgodi, če ThisFunctionMightRaiseAnException dejansko ustvari izjemo in je z njo ne obvladate (to ni isto kot "jesti")?
Kaj pa, če številka / 0 ni obravnavana?
Ko se v vašo kodo vrže neobdelana izjema, Delphi znova čarobno ravna z izjemo, tako da uporabniku prikaže pogovorno okno o napaki. V večini primerov to pogovorno okno ne bo zagotovilo dovolj podatkov za uporabnika (in končno tudi vi), da bi razumel vzrok izjeme.
To je pod nadzorom Delphijeve zgornje ravni sporočilne zanke, kjer vse izjeme obdelujejo globalni aplikacijski objekt in njegova metoda HandleException.
Če želite izjeme obravnavati po vsem svetu in prikazati svoje uporabniško bolj prijazno pogovorno okno, lahko napišete kodo za TApplicationEvents. Obdelovalec dogodkov OnException.
Upoštevajte, da je globalni objekt aplikacije opredeljen v enoti Obrazci. TApplicationEvents je komponenta, ki jo lahko uporabite za prestrezanje dogodkov globalnega predmeta aplikacije.