Par apstrādes izņēmumiem Delphi izņēmumu apstrādē

Šeit ir interesants fakts: Nē kods ir bez kļūdām - patiesībā daži kodi ar nolūku ir pilni ar "kļūdām".

Kāda ir kļūda lietojumprogrammā? Kļūda ir nepareizi kodēts problēmas risinājums. Tādas ir loģikas kļūdas kas var novest pie nepareiziem funkcionēšanas rezultātiem, kur viss šķiet sakopts, bet lietojumprogrammas rezultāts ir pilnīgi nelietojams. Ar loģikas kļūdām, an pieteikums varētu vai varētu pārtraukt darbu.

Izņēmumi var būt kļūdas kodā, ja jūs mēģināt dalīt skaitļus ar nulli vai mēģināt izmantot atbrīvotos atmiņas blokus vai mēģināt funkcijai norādīt nepareizus parametrus. Tomēr izņēmums lietojumprogrammā ne vienmēr ir kļūda.

Izņēmumi un izņēmumu klase

Izņēmumi ir īpaši apstākļi, kuriem nepieciešama īpaša rīcība. Ja rodas kļūdas tips, programma rada izņēmumu.

Jūs (kā lietojumprogrammas rakstītājs) darbosities ar izņēmumiem, lai padarītu jūsu lietojumprogrammu vairāk pakļautu kļūdām un reaģētu uz ārkārtas stāvokli.

Vairumā gadījumu jūs atradīsit sevi kā lietojumprogrammu rakstnieku, bet arī par bibliotēkas rakstnieku. Tātad jums būtu jāzina, kā piesaistīt izņēmumus (no savas bibliotēkas) un kā ar tiem rīkoties (no jūsu pieteikuma).

instagram viewer

Raksts par apstrādes kļūdas un izņēmumi sniedz dažas pamatnostādnes, kā aizsargāties pret kļūdām, izmantojot mēģināt / izņemot / izbeigt un mēģināt / beidzot / izbeigt aizsargātos blokus, lai reaģētu uz ārkārtas apstākļiem vai rīkotos ar tiem.

Izskatās vienkāršs mēģinājums / izņemot aizsargblokus:


mēģiniet
ThisFunctionMightRaiseAnException ();
izņemot// apstrādājiet visus izņēmumus, kas šeit norādīti vietnē ThisFunctionMightRaiseAnException ()
beigas;

Iespējams, ka ThisFunctionMightRaiseAnException ieviešanā būs tāda koda līnija kā


paaugstināt Izņēmums. Izveidot ('īpašs nosacījums!');

Izņēmums ir īpaša klase (viena no nedaudzajām, kuras nosaukuma priekšā nav T), kas definēta vienībā sysutils.pas. SysUtils vienība definē vairākus īpaša mērķa izņēmuma pēcnācējus (un tādējādi izveido izņēmumu klašu hierarhija), piemēram, ERangeError, EDivByZero, EIntOverflow utt.

Vairumā gadījumu izņēmumi, kurus jūs apstrādātu aizsargātajā izmēģināšanas / izņemot blokā, nav izņēmums (bāzes) klase, bet kāda īpaša izņēmuma pēcnācēju klase, kas noteikta vai nu VCL, vai bibliotēkā, kurā atrodaties izmantojot.

Izņēmumu apstrāde, izmantojot mēģinājumu / izņēmumu

Lai noķertu un apstrādātu izņēmuma veidu, jums jākonstruē izņēmumu apstrādātājs “on type_of_exception do”. "Ar izņēmumu do" izskatās diezgan līdzīgi klasiskajam gadījuma paziņojumam:


mēģiniet
ThisFunctionMightRaiseAnException;
izņemot EZeroDivide dobegin// kaut kas, dalot ar nullibeigas;
ieslēgts EIntOverflow dobegin// kaut kas pārāk liela skaitļa aprēķinsbeigas;
cits sākums// kaut kas, kad tiek izvirzīti citi izņēmumu veidibeigas;
beigas;

Ņemiet vērā, ka pārējā daļa satvers visus (citus) izņēmumus, ieskaitot tos, par kuriem neko nezināt. Parasti jūsu kodā būtu jāietver tikai tie izņēmumi, kurus jūs faktiski zināt, kā rīkoties, un jūs domājat, ka tie tiks izmesti.

Nekad nevajadzētu "ēst" izņēmumu:


mēģiniet
ThisFunctionMightRaiseAnException;
izņemot
beigas;

Izņēmuma lietošana nozīmē, ka jūs nezināt, kā rīkoties ar izņēmumu, vai arī nevēlaties, lai lietotāji redzētu izņēmumu vai kaut ko pa vidu.

Kad jūs apstrādājat izņēmumu un no tā jums ir nepieciešams vairāk datu (galu galā tas ir klases piemērs), nevis tikai izņēmuma veids, ko jūs varat darīt:


mēģiniet
ThisFunctionMightRaiseAnException;
izņemot E: Izņēmums dobegin
ShowMessage (E.Message);
beigas;
beigas;

"E": "E: Exception" ir pagaidu izņēmuma veida mainīgais lielums, kas norādīts aiz kolonnas rakstzīmes (iepriekšminētajā piemērā bāzes izņēmumu klase). Izmantojot E, jūs varat nolasīt (vai rakstīt) izņēmuma objekta vērtības, piemēram, iegūt vai iestatīt rekvizītu Message.

Kurš atbalsta izņēmumu?

Vai esat ievērojuši, kā izņēmumi faktiski ir klases gadījumi, kas nolaižas no izņēmuma? Paaugstināšanas atslēgvārds norāda izņēmuma klases gadījumu. Ko jūs izveidojat (izņēmuma piemērs ir objekts), jūs arī to vajag atbrīvot. Ja jūs (kā bibliotēkas rakstnieks) izveidosit gadījumu, vai lietojumprogrammas lietotājs to atbrīvos?

Lūk Delfi maģija: apstrādājot izņēmumu, automātiski tiek iznīcināts izņēmuma objekts. Tas nozīmē, ka, rakstot kodu blokā "izņemot / beigu", tas atbrīvos izņēmuma atmiņu.

Tātad, kas notiek, ja ThisFunctionMightRaiseAnException faktiski rada izņēmumu, un jūs to neizmantojat (tas nav tas pats, kas to “ēst”)?

Kas notiks, ja netiks apstrādāts numurs / 0?

Kad jūsu kodā tiek izmests neapstrādāts izņēmums, Delphi atkal maģiski apstrādā jūsu izņēmumu, parādot lietotājam kļūdu dialoglodziņu. Vairumā gadījumu šis dialogs nesniegs pietiekami daudz datu, lai lietotājs (un visbeidzot arī jūs) saprastu izņēmuma iemeslu.

To kontrolē Delphi augstākā līmeņa ziņojumu cilpa, kur visiem izņēmumus apstrādā globālais lietojumprogrammas objekts un tā metode HandleException.

Lai globāli apstrādātu izņēmumus un parādītu savu, lietotājam draudzīgāku dialogu, varat uzrakstīt TApplicationEvents kodu. OnException notikumu apstrādātājs.

Ņemiet vērā, ka globālais lietojumprogrammas objekts ir definēts vienībā Veidlapas. TApplicationEvents ir komponents, kuru varat izmantot, lai pārtvertu globālā lietojuma objekta notikumus.