Dėl „Delphi“ išimčių tvarkymo išimčių

Štai įdomus faktas: Ne kodas yra be klaidų - iš tikrųjų kai kuriame kode yra tikslinga „klaidų“.

Kokia programos klaida? Klaida yra neteisingai užkoduotas problemos sprendimas. Tokių yra logikos klaidos tai gali sukelti neteisingus funkcijos rezultatus, kai viskas atrodo gražiai sudėta, tačiau programos rezultatas yra visiškai nenaudojamas. Su logikos klaidomis taikymas gali arba gali nustoti veikti.

Išimtys gali būti klaidos jūsų kode, kai bandote padalinti skaičius su nuliu arba bandote naudoti laisvos atminties blokus arba bandote pateikti neteisingus funkcijos parametrus. Tačiau programos išimtis ne visada yra klaida.

Išimtys ir išimčių klasė

Išimtys yra specialios sąlygos, kurias reikia tvarkyti specialiai. Kai įvyksta klaidos tipo programa, programa kelia išimtį.

Jūs (kaip programų rašytojas) tvarkysite išimtis, kad jūsų programa būtų labiau linkusi į klaidas ir atsakytų į išimtines sąlygas.

Daugeliu atvejų jūs atrodysite kaip programų rašytojas, taip pat ir bibliotekos rašytojas. Taigi jūs turėtumėte žinoti, kaip kelti išimtis (iš savo bibliotekos) ir kaip su jomis elgtis (iš savo programos).

instagram viewer

Straipsnis apie tvarkymo klaidos ir išimtys pateikiamos kelios pagrindinės gairės, kaip apsisaugoti nuo klaidų naudojant „bandyti / išskyrus“ / pabaigti ir bandyti / pagaliau / pabaigti apsaugotus blokus, kad būtų galima reaguoti į išskirtines sąlygas arba jas valdyti.

Paprastas bandymas / išskyrus apsauginius blokus atrodo taip:


bandyti
ThisFunctionMightRaiseAnException ();
išskyrus// tvarkykite visas išimtis, nurodytas „ThisFunctionMightRaiseAnException“ () čia
galas;

„ThisFunctionMightRaiseAnException“ įgyvendinimas gali turėti tokios eilutės kodą kaip


kelti Išimtis. Kurti ('ypatinga sąlyga!');

Išimtis yra specialioji klasė (viena iš nedaugelio, be vardo prieš raidę T), apibrėžta rinkinyje sysutils.pas. „SysUtils“ vienetas apibrėžia kelis specialiosios paskirties išimčių palikuonis (ir taip sukuria išimčių klasių hierarchija), pavyzdžiui, „ERangeError“, „EDivByZero“, „EIntOverflow“ ir kt.

Daugeliu atvejų išimtys, kurias galėtumėte naudoti saugomame bandymo / išskyrus bloke, nebus išimtys (pagrindinę) klasę, bet tam tikrą specialią išimties klasę, apibrėžtą VCL arba bibliotekoje, kurioje esate naudojant.

Išimčių tvarkymas naudojant „išbandyti / išskyrus“

Norėdami sugauti ir tvarkyti išimties tipą, sukonstruokite „on type_of_exception do“ išimčių tvarkyklę. „Išimties tvarka“ atrodo panašiai kaip klasikinis atvejis:


bandyti
ThisFunctionMightRaiseAnException;
išskyrus „EZeroDivide“ dobeginas// kažkas dalijant iš nuliogalas;
įjungta EIntOverflow dobeginas// kažkas, kai per didelis sveikasis skaičiavimasgalas;
darbeginas// kažkas, kai iškeliamos kitos išimties rūšysgalas;
galas;

Atminkite, kad kitoje dalyje bus įtrauktos visos (kitos) išimtys, įskaitant tas, apie kurias nieko nežinote. Apskritai, jūsų kodas turėtų būti susijęs tik su išimtimis, kurias jūs iš tikrųjų žinote, kaip elgtis, ir tikimasi, kad jie bus išmesti.

Be to, niekada neturėtumėte „valgyti“ išimties:


bandyti
ThisFunctionMightRaiseAnException;
išskyrus
galas;

Jei naudosite išimtį, jūs nežinote, kaip elgtis su išimtimi, arba nenorite, kad vartotojai matytų išimtį ar bet ką tarp jų.

Kai tvarkote išimtį ir jums reikia daugiau duomenų iš jos (galų gale tai yra klasės egzempliorius), o ne tik išimties tipą, kurį galite padaryti:


bandyti
ThisFunctionMightRaiseAnException;
išskyrus E: Išimtis dobeginas
„ShowMessage“ (E.Message);
galas;
galas;

„E: Išimtis“ „E“ yra laikinas išimties tipo kintamasis, nurodytas po stulpelio simbolio (aukščiau pateiktame pavyzdyje - bazinė išimties klasė). Naudodami E galite nuskaityti (arba parašyti) išimties objekto reikšmes, pvz., Gauti arba nustatyti ypatybę „Pranešimas“.

Kas patenkina išimtį?

Ar pastebėjote, kaip išimtys iš tikrųjų yra klasės atvejai, kai mažėja išimtis? Pakėlimo raktinis žodis išmeta išskirtinės klasės pavyzdį. Ką jūs kuriate (išimties pavyzdys yra objektas), jūs taip pat reikia išlaisvinti. Jei jūs (kaip bibliotekos rašytojas) sukursite egzempliorių, ar programos vartotojas jį išlaisvins?

Štai Delfi magija: tvarkant išimtį automatiškai sunaikinamas išimties objektas. Tai reiškia, kad kai rašysite kodą bloke „išskyrus / pabaiga“, jis išlaisvins išimties atmintį.

Taigi, kas atsitiks, jei „ThisFunctionMightRaiseAnException“ iš tikrųjų kelia išimtį, o jūs jos netvarkote (tai nėra tas pats, kas „valgyti“)?

Kas nutiks, kai skaičius / 0 nebus tvarkomas?

Kai į kodą įmesta netvarkinga išimtis, „Delphi“ vėl stebuklingai tvarko jūsų išimtį, vartotojui parodydamas klaidų dialogo langą. Daugeliu atvejų šis dialogas nepateikia pakankamai duomenų vartotojui (ir galiausiai jums), kad suprastų išimties priežastį.

Tai kontroliuoja „Delphi“ aukščiausio lygio pranešimų ciklas visi išimtys yra apdorojamos naudojant visuotinį taikymo objektą ir jo metodą „HandleException“.

Norėdami tvarkyti išimtis visame pasaulyje ir parodyti savo patogesnį dialogą, galite parašyti „TApplicationEvents“ kodą. „OnException“ renginių tvarkytojas.

Atminkite, kad visuotinis programos objektas yra apibrėžtas formų vienete. „TApplicationEvents“ yra komponentas, kurį galite naudoti norėdami perimti visuotinio taikymo objekto įvykius.