A kivételek kezeléséről a Delphi kivételkezelés területén

Itt van egy érdekes tény: Nem kód hibamentes - valójában néhány kód tele van "hibákkal" szándékosan.

Mi a hiba egy alkalmazásban? A hiba helytelenül kódolt megoldást jelent a problémára. Ilyenek logikai hibák ez hibás működési eredményekhez vezethet, ahol minden szépen összeállítva tűnik, de az alkalmazás eredménye teljesen használható. Logikai hibákkal, egy Alkalmazás lehet, hogy nem működik.

A kivételek között szerepelhetnek hibák a kódban, amikor megpróbálja megosztani a számokat nullával, vagy megszabadult memória blokkokat használ, vagy megpróbál rossz funkciókat megadni. Az alkalmazás kivétele azonban nem mindig hiba.

Kivételek és a kivételes osztály

Kivételt képeznek a különleges körülmények, amelyek különleges kezelést igényelnek. Hiba típusú feltétel esetén a program kivételt vet fel.

Ön (mint alkalmazás-író) kivételeket kezel, hogy az alkalmazás jobban hajlamos legyen a hibára, és reagáljon a kivételes körülményekre.

A legtöbb esetben úgy találja, hogy az alkalmazás írója és a könyvtár írója. Tehát tudnia kell, hogyan lehet kivételeket felhozni (a könyvtárból) és hogyan kell kezelni azokat (az alkalmazásból).

instagram viewer

A cikk a kezelési hibák és kivételek néhány alapvető útmutatást nyújt a hibákkal szembeni védelemhez, ha a próbálkozás / kivétel / befejezés és a védett blokkok kipróbálása / befejezése / befejezése során kivételes körülményekre reagálnak vagy kezelhetők.

Egy egyszerű próbálkozás / kivéve az őrző blokkokat néz ki:


próbálja meg
ThisFunctionMightRaiseAnException ();
kivéve// itt kezelje a ThisFunctionMightRaiseAnException () felsorolt ​​kivételeket
vég;

Lehetséges, hogy a ThisFunctionMightRaiseAnException végrehajtása során egy olyan sornyi kódot tartalmaz, mint a


emel Kivétel. Létrehozás ('különleges feltétel!');

A kivétel a sysutils.pas egységben meghatározott speciális osztály (a kevés közül egy a T előtt a név előtt). A SysUtils egység számos speciális célú kivételt képező leszármazottat határoz meg (és így létrehoz kivételes osztályok hierarchiája), mint például az ERangeError, EDivByZero, EIntOverflow stb.

A legtöbb esetben azok a kivételek, amelyeket a védett próbálkozás / kivétel blokkban kezelne, nem tartoznak kivételhez (alap) osztály, de a VCL-ben vagy a könyvtárban meghatározott speciális leszármazott osztály használatával.

Kivételek kezelése a Try / Kivétel használatával

Egy kivételtípus elfogásához és kezeléséhez létre kell hoznia egy "on type_of_exception do" kivételkezelőt. A "kivételével" nagyjából hasonlít a klasszikus esetre:


próbálja meg
ThisFunctionMightRaiseAnException;
excepton EZeroDivide dobegin// valami, ha nullával osztjukvég;
tovább EIntOverflow dobegin// valami, ha túl nagy egész számítás történikvég;
elsebegin// valami, ha más kivételtípusok merülnek felvég;
vég;

Vegye figyelembe, hogy a másik rész megragadná az összes (egyéb) kivételt, beleértve azokat is, amelyekről sincs semmit. Általában véve, hogy a kód csak olyan kivételekkel foglalkozzon, amelyeket valójában tudsz kezelni, és elvárják, hogy dobják őket.

Ezenkívül soha nem szabad "enni" kivételt:


próbálja meg
ThisFunctionMightRaiseAnException;
kivéve
vég;

A kivétel használata azt jelenti, hogy nem tudja, hogyan kell kezelni a kivételt, vagy nem akarja, hogy a felhasználók látják a kivételt, vagy bármi mást, ami köztük van.

Amikor kezeli a kivételt, és további adatokra van szüksége tőle (elvégre egy osztály példánya), inkább csak a kivétel típusát tudja megtenni:


próbálja meg
ThisFunctionMightRaiseAnException;
excepton E: Kivétel dobegin
ShowMessage (E.Message);
vég;
vég;

Az "E" az "E: Kivétel" alatt egy ideiglenes kivételes változó, az oszlop karakter után megadott típusú (a fenti példában az alapkivétel osztály). Az E gombbal elolvashatja (vagy írhat) értékeket a kivételes objektumhoz, például beolvashatja vagy beállíthatja az Üzenet tulajdonságot.

Ki felel meg a kivételnek?

Észrevetted, hogy a kivételek valójában milyen esetekben járnak egy osztálynak, amely a Kivételtől származik? Az emelési kulcsszó kivételes osztálypéldányt dob. Amit hoz létre (a kivételes példány egy objektum), az Ön is meg kell szabadítani. Ha (mint könyvtári író) létrehoz egy példányt, felszabadítja az alkalmazás felhasználója?

Itt van a Delphi varázslat: A kivétel kezelése automatikusan megsemmisíti a kivétel objektumát. Ez azt jelenti, hogy ha a kódot a "kivétel / vége" blokkba írja, akkor ez felszabadítja a kivételmemóriát.

Tehát mi történik, ha a ThisFunctionMightRaiseAnException valóban kivételt vet fel, és nem kezeli (ez nem ugyanaz, mint az, hogy „megeszel”)?

Mi van, ha a / 0 számot nem kezelik?

Amikor nem kezelt kivétel kerül a kódba, a Delphi ismét varázslatosan kezeli az Ön kivételét azáltal, hogy a felhasználó számára megjeleníti a hiba párbeszédpanelt. A legtöbb esetben ez a párbeszédpanel nem szolgáltat elegendő adatot a felhasználó (és végül Ön) számára a kivétel okának megértéséhez.

Ezt a Delphi legfelső szintű üzenet hurokja irányítja, ahol minden a kivételeket a globális alkalmazásobjektum és annak HandleException módszere dolgozza fel.

A kivételek globális kezeléséhez és a felhasználóbarátabb párbeszédpanel megjelenítéséhez írhat kódot a TApplicationEvents számára. OnException eseménykezelő.

Vegye figyelembe, hogy a globális alkalmazásobjektum a Forms egységben van meghatározva. A TApplicationEvents egy olyan összetevő, amellyel megfoghatja a globális alkalmazásobjektum eseményeit.

instagram story viewer