Erandite käsitlemine Delphi erandkäsitluses

Siin on huvitav fakt: Ei kood on vigadeta - tegelikult on mõni kood tahtlikult "vigu" täis.

Mis viga rakenduses on? Viga on probleemile valesti kodeeritud lahendus. Sellised on loogikavead mis võib põhjustada vale funktsiooni tulemusi, kus kõik tundub kenasti kokku pandud, kuid rakenduse tulemus on täiesti kasutamatu. Loogikavigadega an rakendus võib töötamise lõpetada või mitte.

Eranditeks võivad olla vead koodis, kus proovite jagada numbreid nulliga või proovite kasutada vaba mäluplokke või proovite funktsioonile valesid parameetreid anda. Kuid rakenduse erand ei ole alati viga.

Erandid ja erandklass

Erandiks on eritingimused, mis nõuavad erikäsitlust. Tõrketüübi ilmnemisel tõstab programm erandi.

Teie (rakenduse kirjutajana) menetlete erandeid, et muuta teie taotlus vigaderohkemaks ja reageerida erandlikele tingimustele.

Enamasti leiad end olevat rakenduste kirjutaja ja ka raamatukogu kirjutaja. Seega peaksite teadma, kuidas erandeid (oma raamatukogust) tõsta ja kuidas neid käsitleda (oma rakendusest).

instagram viewer

Artikkel teemal vigade ja erandite käsitlemine annab mõned põhijuhised vigade eest kaitsmiseks, kasutades proovida / va / lõpetada ja proovida / lõpuks / lõpetada kaitstud plokke, et erakorralistele tingimustele reageerida või nendega toime tulla.

Lihtne proovida / välja arvatud kaitseplokid näeb välja selline:


proovida
ThisFunctionMightRaiseAnException ();
välja arvatud// siin käsitlege kõiki jaotises ThisFunctionMightRaiseAnException () tõstatatud erandeid
lõpp;

Selle funktsiooniMightRaiseAnException rakendamisel võib olla koodirea nagu


tõsta Erand. Loo ('eritingimus!');

Erand on eriklass (üks vähestest ilma nimeta T ees), mis on määratletud üksuses sysutils.pas. Üksus SysUtils määratleb mitu eriotstarbelise erandi järeltulijat (ja seega loob erandklasside hierarhia) nagu ERangeError, EDivByZero, EIntOverflow jne.

Enamikul juhtudel pole erandid, mida teeksite kaitstud proovimise / väljajätmise blokis (põhiklass), kuid mingist spetsiaalsest erandjärglasest klassist, mis on määratletud kas VCL-is või teie raamatukogus kasutades.

Erandite käsitlemine proovimise / erandi abil

Eranditüübi püüdmiseks ja käsitlemiseks konstrueerige erandite käitleja "on type_of_exception do". Väljend "erandkorras" näeb välja üsna sarnane klassikalise juhtumiavaldusega:


proovida
ThisFunctionMightRaiseAnException;
välja arvatud EZeroDivide dobegin// midagi nulliga jagadeslõpp;
peal EIntOverflow dobegin// midagi liiga suure täisarvu arvutamisellõpp;
elsebegin// midagi muud, kui tõstatatakse muid eranditüüpelõpp;
lõpp;

Pange tähele, et teine ​​osa haaraks kõik (muud) erandid, sealhulgas need, millest te ei tea midagi. Üldiselt peaks teie kood käsitlema ainult selliseid erandeid, mida tegelikult teate ja kuidas loodetakse visata.

Samuti ei tohiks te kunagi "süüa" erandit:


proovida
ThisFunctionMightRaiseAnException;
välja arvatud
lõpp;

Erandi söömine tähendab, et te ei tea, kuidas erandit käsitleda, või te ei soovi, et kasutajad näeksid erandit või midagi vahepealset.

Kui käsitlete erandit ja vajate selle kohta rohkem andmeid (see on ju klassi näide), siis ainult erandi tüüp, mida saate teha:


proovida
ThisFunctionMightRaiseAnException;
välja arvatud E: Erand dobegin
ShowMessage (E.Message);
lõpp;
lõpp;

E-täht jaotises E: erand on ajutise erandi muutuja tüüp, mis on täpsustatud veeru tähemärgi järel (ülaltoodud näites baas-erandiklass). E abil saate erandobjektile väärtusi lugeda (või kirjutada), näiteks atribuuti Sõnum hankimine või määramine.

Kes erandi heaks kiidab?

Kas olete märganud, kuidas erandid on tegelikult klassist, mis laskub erandist? Tõstmise märksõna viskab erandklassi astme. Mida loote (erandiks on objekt), seda ka teie vaja vabastada. Kui loote (raamatukogu kirjutajana) eksemplari, kas rakenduse kasutaja vabastab selle?

Siin on Delphi maagia: erandi käitlemine hävitab erandiobjekti automaatselt. See tähendab, et kui kirjutate koodi lahtrisse "va / lõpp", vabastab see erandimälu.

Mis juhtub, kui ThisFunctionMightRaiseAnException tõstab tegelikult välja erandi ja te ei tegele sellega (see ei ole sama, mis seda "süüa")?

Mis saab siis, kui numbrit / 0 ei käideta?

Kui teie koodi on sisestatud töötlemata erand, tegeleb Delphi taas võluväel teie erandiga, kuvades kasutajale veadialoogi. Enamikul juhtudel ei paku see dialoog kasutaja (ja lõpuks teie) jaoks piisavalt andmeid, et mõista erandi põhjust.

Seda kontrollib Delphi tipptasemel sõnumsilm, kus kõik erandeid töötleb globaalne rakendusobjekt ja selle meetod HandleException.

Erandite globaalseks käsitlemiseks ja oma kasutajasõbralikuma dialoogi kuvamiseks võite kirjutada koodi TApplicationEvents. OnExceptioni sündmuste käitleja.

Pange tähele, et globaalne rakendusobjekt on määratletud üksuses Vormid. TApplicationEvents on komponent, mida saate kasutada globaalse rakenduse objekti sündmuste pealtkuulamiseks.

instagram story viewer