Si të konfiguroni telefonat inteligjentë dhe PC. Portali informativ
  • në shtëpi
  • Këshilla
  • Gabimet tipike të kodit si të mprehtë. Korrigjimi dhe trajtimi i përjashtimeve

Gabimet tipike të kodit si të mprehtë. Korrigjimi dhe trajtimi i përjashtimeve

Bazat e trajtimit të përjashtimeve

Gabimet nuk janë gjithmonë faji i personit që kodon aplikacionin. Ndonjëherë një aplikacion gjeneron një gabim për shkak të veprimeve të përdoruesit fundor, ose gabimi shkaktohet nga konteksti i mjedisit në të cilin po ekzekutohet kodi. Në çdo rast, gjithmonë duhet të prisni gabime në aplikacionet tuaja dhe kodin sipas këtyre pritjeve.

.NET Framework ofron trajtim të avancuar të gabimeve. Mekanizmi i trajtimit të gabimeve C # ju lejon të kodoni trajtimin e personalizuar për çdo lloj kushti gabimi, dhe gjithashtu të shkëputni kodin që gjeneron gabime nga kodi që i trajton ato.

Çfarëdo që e shkakton problemin, aplikacioni përfundimisht do të fillojë të sillet ndryshe nga sa pritej. Përpara se të kalojmë në trajtimin e strukturuar të përjashtimeve, le të hedhim një vështrim në tre termat më të përdorur për të përshkruar anomalitë:

Defektet e softuerit

Ky është zakonisht emri i gabimeve që bën programuesi. Për shembull, supozoni se një aplikacion po ndërtohet duke përdorur C ++ të pamenaxhuar. Nëse memoria e ndarë në mënyrë dinamike nuk çlirohet, e cila është e mbushur me një rrjedhje memorie, ndodh një gabim programimi.

Gabimet e përdoruesit

Ndryshe nga gabimet e softuerit, gabimet e personalizuara zakonisht shkaktohen nga kushdo që drejton aplikacionin, jo kushdo që e ndërton atë. Për shembull, një përdorues fundor që fut një varg të formatuar gabimisht në një fushë teksti mund të gjenerojë një gabim të këtij lloji nëse kodi nuk është krijuar për të trajtuar hyrjen e pasaktë.

Përjashtimet

Përjashtimet, ose përjashtimet, zakonisht quhen anomali që mund të ndodhin në kohën e ekzekutimit dhe që janë të vështira, nëse jo të pamundura, të parashikohen kur programoni një aplikacion. Këto përjashtime të mundshme përfshijnë përpjekjen për t'u lidhur me një bazë të dhënash që nuk ekziston më, përpjekjen për të hapur një skedar të dëmtuar ose përpjekjen për të komunikuar me një makinë që aktualisht është jashtë linje. Në secilin prej këtyre rasteve, programuesi (dhe përdoruesi përfundimtar) mund të bëjë pak për këto rrethana "të jashtëzakonshme".

Nga përshkrimet e mësipërme, duhet të jetë e qartë se trajtimi i strukturuar i përjashtimeve në .NET është një teknikë e krijuar për t'u marrë me përjashtimet që mund të hidhen në kohën e ekzekutimit. Edhe në rastin e gabimeve të programimit dhe përdoruesve që i kanë shpëtuar syrit të programuesit, megjithatë, CLR shpesh do të gjenerojë automatikisht një përjashtim të përshtatshëm që përshkruan problemin aktual. Bibliotekat e klasës bazë .NET përcaktojnë shumë përjashtime të ndryshme si FormatException, IndexOutOfRangeException, FileNotFoundException, ArgumentOutOfRangeException, etj.

Në terminologjinë .NET, "përjashtimi" i referohet gabimeve të programimit, gabimeve të përdoruesit dhe gabimeve në kohën e ekzekutimit. Përpara se të zhytemi në detaje, le të shohim se çfarë roli luan trajtimi i përjashtimeve të strukturuara dhe si ndryshon nga teknikat tradicionale të trajtimit të gabimeve.

Roli i trajtimit të përjashtimeve në .NET

Para ardhjes së .NET, trajtimi i gabimeve në sistemin operativ Windows ishte një përzierje komplekse teknologjish. Shumë programues kanë përfshirë logjikën e tyre të trajtimit të gabimeve në kontekstin e aplikimit të interesit. Për shembull, ekipi i zhvillimit mund të përcaktojë një grup konstantesh numerike për të përfaqësuar dështimet e njohura dhe më pas t'i përdorë ato konstante si vlera të kthimit për metodat.

Përveç mashtrimeve të shpikura nga vetë zhvilluesit, API i Windows përcakton qindra kode gabimi duke përdorur #define dhe HRESULT, si dhe shumë variacione të vlerave të thjeshta boolean (bool, BOOL, VARIANT BOOL, etj.). Për më tepër, shumë zhvillues C ++ të aplikacioneve COM (si dhe VB 6) përdorin në mënyrë eksplicite ose të nënkuptuar një grup të vogël ndërfaqesh standarde COM (si ISupportErrorlnfo. IErrorlnfo ose ICreateErrorlnfo) për të kthyer informacion kuptimplotë të gabimit te klienti COM.

Problemi i dukshëm me të gjitha këto teknika të vjetra është mungesa e simetrisë. Secila prej tyre pak a shumë përshtatet në kuadrin e një teknologjie, një gjuhe dhe, ndoshta, edhe të një projekti. B.NET mban një teknikë standarde për gjenerimin dhe zbulimin e gabimeve në mjedisin e ekzekutimit të quajtur Trajtimi i strukturuar i përjashtimeve (SEH) .

E bukura e kësaj teknike është se i lejon zhvilluesit të kenë një qasje uniforme për trajtimin e gabimeve që është e zakonshme për të gjitha gjuhët që synojnë platformën .NET. Kjo i lejon një programuesi C # të trajtojë gabimet në të njëjtën mënyrë sintaksore si një programues VB dhe një programues C ++ duke përdorur C ++ / CLI.

Një përfitim shtesë është se sintaksa e kërkuar për të hedhur dhe kapur përjashtime jashtë asambleve dhe makinave duket gjithashtu e njëjtë. Për shembull, nëse po shkruani një shërbim Windows Communication Foundation (WCF) në C #, mund të vendosni një përjashtim SOAP për një telefonues në distancë duke përdorur të njëjtat fjalë kyçe që përdoren për të hedhur një përjashtim brenda metodave në të njëjtin aplikacion.

Përditësimi i fundit: 23.10.2018

Ndonjëherë, gjatë ekzekutimit të një programi, lindin gabime që janë të vështira për t'u parashikuar ose parashikuar, dhe ndonjëherë ato janë plotësisht të pamundura. Për shembull, kur transferoni një skedar përmes një rrjeti, lidhja e rrjetit mund të bjerë papritur. situata të tilla quhen përjashtime. Gjuha C # u ofron zhvilluesve aftësinë për të trajtuar këto situata. Përpiquni ... kapni ... më në fund konstrukti është projektuar për këtë në C #.

Provoni () kapni () më në fund ()

Kur përdorni një bllok try ... catch..më në fund, të gjitha deklaratat në bllokun try ekzekutohen së pari. Nëse në këtë bllok nuk janë hedhur përjashtime, atëherë pas ekzekutimit të tij fillon të ekzekutohet blloku përfundimtar. Dhe pastaj konstruksioni provo..catch..më në fund përfundon punën e tij.

Nëse një përjashtim hidhet në bllokun provo, rendi normal i ekzekutimit ndalon dhe CLR fillon të kërkojë një bllok kapje që mund të trajtojë përjashtimin. Nëse gjendet blloku i dëshiruar i kapjes, atëherë ai ekzekutohet dhe pasi të përfundojë, ekzekutohet blloku përfundimtar.

Nëse blloku i kërkuar i kapjes nuk gjendet, atëherë kur ndodh një përjashtim, programi do të rrëzohet.

Merrni parasysh shembullin e mëposhtëm:

Programi i klasës (kryesore e zbrazët statike (args varg) (int x = 5; int y = x / 0; Console.WriteLine ($ "Rezultati: (y)"); Console.WriteLine ("Fundi i programit"); Console.Lexo ();))

Në këtë rast, numri pjesëtohet me 0, gjë që do të rezultojë në një përjashtim. Dhe kur e nisim aplikacionin në modalitetin e korrigjimit, do të shohim një dritare në Visual Studio që informon për përjashtimin:

Në këtë dritare, shohim se është hedhur një përjashtim, i cili është i tipit System.DivideByZeroException, pra një përpjekje për të pjesëtuar me zero. Duke përdorur artikullin Shiko Detajet, mund të shikoni informacion më të detajuar rreth përjashtimit.

Dhe në këtë rast, e vetmja gjë që na mbetet është të përfundojmë ekzekutimin e programit.

Për të shmangur një ndërprerje të tillë jonormale të programit, duhet të përdorni konstruktin provo ... kap ... përfundimisht për të trajtuar përjashtimet. Pra, le ta rishkruajmë shembullin si më poshtë:

Programi i klasës (kryesore statike e zbrazët (args varg) (provoni (int x = 5; int y = x / 0; Console.WriteLine ($ "Rezultati: (y)");) catch (Console.WriteLine ("Një përjashtim ishte hedhur! ");) më në fund (Console.WriteLine (" më në fund bllok ");) Console.WriteLine (" Fundi i programit "); Console.Read ();))

Në këtë rast, do të kemi përsëri një përjashtim në bllokun e provoni, pasi po përpiqemi të pjesëtojmë me zero. Dhe duke arritur në linjë

Int y = x / 0;

programi do të ndalojë së funksionuari. CLR gjen bllokun e kapjes dhe transferon kontrollin në atë bllok.

Pas bllokut të kapjes, blloku përfundimtar do të ekzekutohet.

U hodh një përjashtim! Blloko përfundimisht Fundin e programit

Kështu, programi ende nuk do të kryejë ndarjen me zero dhe, në përputhje me rrethanat, nuk do të shfaqë rezultatin e kësaj ndarjeje, por tani ai nuk do të rrëzohet dhe përjashtimi do të trajtohet në bllokun e kapjes.

Duhet të theksohet se në këtë ndërtim kërkohet një bllok prove. Me një bllok kapje, ne mund të heqim bllokun përfundimtar:

Provoni (int x = 5; int y = x / 0; Console.WriteLine ($ "Rezultati: (y)");) catch (Console.WriteLine ("Ka ndodhur një përjashtim!");)

Anasjelltas, me një bllok përfundimtar, ne mund të heqim bllokun e kapjes dhe të mos trajtojmë përjashtimin:

Provoni (int x = 5; int y = x / 0; Console.WriteLine ($ "Rezultati: (y)");) më në fund (Console.WriteLine ("bllokoni përfundimisht");)

Sidoqoftë, megjithëse nga pikëpamja e sintaksës C #, ky ndërtim është mjaft i saktë, megjithatë, pasi CLR nuk mund të gjejë bllokun e nevojshëm të kapjes, përjashtimi nuk do të trajtohet dhe programi do të rrëzohet.

Trajtimi me përjashtim dhe ndërtimet me kusht

Një numër përjashtimesh mund të parashikohen nga zhvilluesi. Për shembull, supozoni se një program ofron hyrjen e një numri dhe daljen e katrorit të tij:

Kryesorja statike e zbrazët (args vargu) (Console.WriteLine ("Fut një numër"); int x = Int32.Parse (Console.ReadLine ()); x * = x; Console.WriteLine ("Numri katror:" + x) ; Console.Read ();)

Nëse përdoruesi nuk fut një numër, por një varg, disa karaktere të tjera, atëherë programi do të bjerë në një gabim. Nga njëra anë, kjo është pikërisht situata ku mund të përdorni një bllok try..catch për të trajtuar një gabim të mundshëm. Sidoqoftë, do të ishte shumë më optimale të kontrollohej vlefshmëria e konvertimit:

Kryesorja statike e zbrazët (args vargu) (Console.WriteLine ("Fut një numër"); int x; hyrja e vargut = Console.ReadLine (); nëse (Int32.TryParse (hyrje, jashtë x)) (x * = x; Konsolë . WriteLine ("Numri katror:" + x);) tjetër (Konsola.WriteLine ("Hyrje e pavlefshme");) Konsolë. Lexo ();)

Metoda Int32.TryParse () kthen true nëse transformimi mund të kryhet, dhe false nëse nuk mundet. Nëse konvertimi është i vlefshëm, ndryshorja x do të përmbajë numrin e futur. Pra, pa përdorur try ... catch, ju mund të trajtoni një përjashtim të mundshëm.

Nga pikëpamja e performancës, përdorimi i blloqeve try..catch është më i shtrenjtë se përdorimi i kushteve. Prandaj, sa herë që është e mundur, në vend që të provoni..catch, është më mirë të përdorni konstruksione të kushtëzuara për të kontrolluar për përjashtime.

konstantet e kompilimit të kushtëzuar... Ai lejon përcaktimin e konstantave të përdorura më vonë në metodën e printimit të kushtëzuar WriteIf të klasave Debug dhe Trace. Fuqia e këtij mekanizmi është se konstantet mund të ndryshohen në skedarin e konfigurimit të projektit pa ndryshuar kodin e projektit ose pa kërkuar që ai të ripërpilohet.

Debugging dhe Visual Studio .Net Toolbox

Mjedisi instrumental i studios i ofron programuesit gamën më të gjerë të mundësive për ndjekjen e ecurisë së llogaritjeve dhe gjurmimin e gjendjeve në të cilat ndodhet procesi i llogaritjeve. Meqenëse të gjitha mjediset moderne të veglave janë të organizuara në mënyrë të ngjashme dhe janë të njohura mirë për programuesit që punojnë, nuk do të ndalem në përshkrimin e aftësive të mjedisit.

Trajtimi me përjashtim

Pavarësisht se sa i besueshëm është shkruar kodi, pavarësisht sa i plotë është korrigjimi, do të ketë shkelje të specifikimeve në versionin e lëshuar për prodhim dhe mirëmbajtje. Arsyet për këtë janë ligjet e lartpërmendura teknikë programesh... Gabimi i fundit mbetet në sistem, ka përdorues që nuk i dinë specifikimet, dhe nëse specifikimi mund të shkelet, atëherë kjo ngjarje do të ndodhë një ditë. Të tillë situata të jashtëzakonshme vazhdimi i programit ose bëhet i pamundur (një përpjekje për të kryer një ndarje të paautorizuar me operacion zero, përpjekje për të shkruar në një zonë të mbrojtur të memories, një përpjekje për të hapur një skedar jo-ekzistent, një përpjekje për të marrë një bazë të dhënash jo-ekzistente rekord), ose në një situatë që lind, aplikimi i algoritmit do të çojë në rezultate të gabuara.

Çfarë duhet bërë nëse situatë e jashtëzakonshme? Sigurisht, ekziston gjithmonë një mënyrë standarde - për të raportuar gabimin që ka ndodhur dhe për të ndërprerë ekzekutimin e programit. Është e qartë se kjo është e pranueshme vetëm për aplikime të padëmshme; edhe për lojërat kompjuterike, kjo metodë nuk është e përshtatshme, e lëre më aplikacionet kritike!

Në gjuhët e programimit për përpunim situata të jashtëzakonshme janë propozuar një sërë qasjesh.

C / C ++ Trajtimi i përjashtimeve

Stili i programimit C karakterizohet nga përshkrimi i metodave të klasës si funksione Boolean që kthehen true nëse metoda përfundon normalisht dhe false nëse ndodh. situatë e jashtëzakonshme... Thirrja e metodës u fut në deklaratën If, e cila trajton një gabim në rast të dështimit të përfundimit të metodës:

bool MyMethod (...) (...) nëse! MyMethod () (// trajtimi i gabimeve) (// ekzekutimi normal)

Disavantazhet e kësaj skeme janë të qarta. Së pari, ka pak informacion për shkakun e gabimit, kështu që informacioni shtesë duhet të kalohet ose përmes fushave të klasës ose përmes argumenteve të metodës. Së dyti, blloku i përpunimit është i ngulitur në çdo thirrje, gjë që çon në fryrje të kodit.

Prandaj, në C / C ++, përdoret skema e bllokut try / catch, thelbi i së cilës është si më poshtë. Seksioni i programit në të cilin mund të jetë situatë e jashtëzakonshme, ekzekutohet në formën e një blloku prove të ruajtur. Nëse gjatë ekzekutimit të tij ndodh situatë e jashtëzakonshme, atëherë ndërpritet ekzekutimi i try-block me klasifikimin e përjashtimit. Një nga blloqet e kapjes që përputhet me llojin e përjashtimit fillon të trajtojë këtë përjashtim. Ekzistojnë dy skema të tilla të përdorura në C / C ++. Një prej tyre - skema e rinisë- korrespondon me të ashtuquajturat strukturore, ose C-përjashtimet. Skema e dytë është pa rinovim- përputhet me përjashtimet C ++. Në skemën e parë, mbajtësi i përjashtimeve - blloku i kapjes - e kthen kontrollin në një pikë të bllokut të provoni. Në skemën e dytë, kontrolli nuk kthehet në bllokun e "provës".

Me disa dallime sintaksore skema e rinisë përdoret në gjuhët VB / VBA.

Skema e trajtimit të përjashtimeve në C #

Gjuha C # trashëgoi skemën e përjashtimit C ++, duke bërë rregullimet e veta në të. Le të shqyrtojmë skemën më në detaje dhe të fillojmë me sintaksën e konstruksionit provo-kap-në fund:

provo (...) kap (T1 e1) (...) ... kap (Tk ek) (...) më në fund (...)

Kudo që një bllok lejohet në mënyrë sintaksore në një tekst të modulit, blloku mund të ruhet duke shtuar fjalën kyçe provo. Blloku i provoni mund të ndiqet nga blloqet e kapjes që quhen blloqet e mbajtësve të përjashtimeve, mund të jenë disa prej tyre, mund të mungojnë. Plotëson këtë sekuencë më në fund bllokoj- bllok finalizimi, i cili gjithashtu mund të mungojë. I gjithë ky konstruksion mund të jetë i mbivendosur - blloku i provës mund të përfshijë ndërtimin provo-kap-në fund.

Hedhja e përjashtimeve. Krijimi i objekteve me përjashtim

Trupi i një blloku provoni mund të përmbajë situatë e jashtëzakonshme duke çuar në duke hedhur përjashtime... Formalisht duke hedhur një përjashtim ndodh kur ekzekutohet një deklaratë hedhjeje. Kjo deklaratë më së shpeshti ekzekutohet në zorrët e sistemit operativ kur sistemi i komandës ose funksioni API nuk mund të bëjë punën e tij. Por kjo deklaratë mund të jetë pjesë e tekstit të programit të try-block dhe të ekzekutohet kur, si rezultat i analizës, bëhet e qartë se funksionimi i mëtejshëm normal është i pamundur.

Në mënyrë sintaksore, deklarata e hedhjes është:

hedh [shprehje]

Klauzola e hedhjes specifikon një objekt të një klase që trashëgon nga klasa Exception. Kjo është zakonisht një shprehje e re që krijon një objekt të ri. Nëse mungon, atëherë përjashtimi aktual hidhet sërish. Nëse sistemi operativ hedh një përjashtim, atëherë ai e klasifikon përjashtimin vetë, krijon një objekt të klasës përkatëse dhe automatikisht plotëson fushat e tij.

Në modelin që po shqyrtojmë, përjashtime janë objektet, klasa e të cilave është pasardhëse e klasës Exception. Kjo klasë dhe pasardhësit e saj të shumtë janë pjesë e FCL, megjithëse janë të shpërndara nëpër hapësira të ndryshme emrash. Çdo klasë përcakton një lloj të veçantë përjashtimi në përputhje me klasifikimin e miratuar në .Net Framework. Këtu janë vetëm disa klasa me përjashtim nga hapësira e emrave të sistemit: ArgumentException, ArgumentOutOfRangeException, ArithmeticException, BadImageFormatException, DivideByZeroException, OverflowException. Hapësira e emrave System.IO përmban klasa me përjashtim lidhur me çështjet e I/O: DirectoryNotFoundException, FileNotFoundException dhe shumë të tjera. Emrat e të gjithëve klasa me përjashtim përfundojnë me fjalën Përjashtim. Ju lejohet të krijoni tuajën klasa me përjashtim duke i trashëguar ato nga klasa Exception.

Kur ekzekutohet deklarata e hedhjes, krijohet një objekt te, klasa TE e të cilit karakterizon përjashtimin aktual dhe fushat përmbajnë informacion rreth situatë e jashtëzakonshme... Ekzekutimi i deklaratës së hedhjes bën që procesi normal i llogaritjes të përfundojë atje. Nëse kjo ndodh në një bllok prove të ruajtur, atëherë fillon faza "kapur" një përjashtim një nga trajtuesit e përjashtimeve.

Kapja e një përjashtimi

Blloku i kapjes - mbajtësi i përjashtimit ka sintaksën e mëposhtme:

kap (T e) (...)

Klasa T e specifikuar në kokën e bllokut të kapjes duhet t'i përkasë klasa me përjashtim... Një bllok kapje me një argument formal e të klasës T është potencialisht i aftë të kapë përjashtimin aktual te të klasës TE nëse dhe vetëm nëse caktimi është i pajtueshëm me e. Me fjalë të tjera, kapja e mundshme do të thotë që caktimi e = te është i vlefshëm, gjë që është e mundur kur TE është pasardhës i T. Një trajtues, klasa T e të cilit është klasa Exception është mbajtës universal, është potencialisht i aftë për të kapur ndonjë përjashtim, pasi ata janë të gjithë pasardhës të tij.

Mund të ketë shumë pushtues të mundshëm; vetëm njëri kap një përjashtim - ai që është i pari në listën e kontrollit. Cili është urdhri i kontrollit? Është mjaft e natyrshme. Së pari, mbajtësit kontrollohen sipas radhës që ndjekin bllokun e "provës" dhe pushtuesi i parë potencial bëhet aktiv, duke kapur përjashtimin dhe duke e trajtuar atë. Kjo e bën të qartë se renditja e blloqeve të kapjes është jashtëzakonisht e rëndësishme. Të parët janë më mbajtës të specializuar, më tej me rritjen e shkathtësisë. Pra, së pari duhet të ketë një mbajtës përjashtimi DivideByZeroException, i ndjekur nga Main. Nëse nuk ka asnjë kapës të mundshëm përjashtimi në të, atëherë do të aktivizohet mbajtësi standard, duke ndërprerë ekzekutimin e programit dhe duke lëshuar një mesazh përkatës.

Diten e mire! Sot do të flasim se si të trajtojmë gabimet në programet e shkruara në C #.

Dua të vërej menjëherë se gabimet në programe mund të ndahen me kusht në dy grupe: gabime në kohën e ndërtimit të programit (në fazën e përpilimit) dhe gabime në kohën e ekzekutimit të programit. Ky tutorial do të flasë për gabimet e ekzekutimit!

Le të kujtojmë një shembull nga mësimi i mëparshëm ku përdoruesi duhej të fuste dy numra të plotë nga tastiera. Pastaj kërkova të fusja saktësisht numra dhe saktësisht numra të plotë. Pse? Deri, sepse nëse në atë program futni jo një numër, por thjesht tekst, ose jo një numër të plotë, por një numër thyesor, atëherë do të ketë një gabim në kohëzgjatje! Është për këtë arsye që sot po ju tregoj për mekanizmat dhe parimet e trajtimit të gabimeve në programe.

Pra, nëse dyshojmë se programi ynë mund të ketë gabime në kohën e ekzekutimit, për shembull, për shkak të faktit se përdoruesi ka futur të dhëna të pasakta, ne duhet të kujdesemi për trajtimin e këtyre gabimeve. Qasja për trajtimin e situatave të tilla konsiston në rregullat e mëposhtme: ndahet një bllok kodi, gjatë ekzekutimit të të cilit mund të ndodhin gabime; ndahet një bllok kodi që është përgjegjës për trajtimin e gabimeve që kanë ndodhur.

Një bllok kodi në të cilin mund të ndodhin gabime tregohet me një fjalë kyçe provoni e ndjekur nga mbajtëset me kaçurrela (të cilat përfshijnë operacione potencialisht të rrezikshme). Një bllok i tillë duhet të pasohet menjëherë nga një bllok përpunimi i gabimeve, ai shënohet me fjalën kyçe kap, dhe në kllapa pas kësaj fjale, tregon llojin e gabimeve që përpunon blloku i të dhënave të kodit, pas kllapave mbyllëse, pasuar nga kllapat kaçurrela, brenda të cilave zbatohet përpunimi. Skematikisht, duket kështu:

Provoni (// Bllokun e kodit potencialisht të rrezikshëm) catch (error_type) (// Trajtimi i gabimeve) // Deklarata të mëtejshme të programit

Dhe funksionon kështu nëse është në bllok provoni, nuk ndodhi asnjë gabim, më pas blloko kap nuk ekzekutohet, dhe kontrolli kalon, d.m.th. ekzekutohet blloku i mëposhtëm kap operatori. Por nëse brenda bllokut provoni ka ndodhur një gabim, atëherë ekzekutimi i këtij blloku ndërpritet dhe kontrolli transferohet në bllok kap, dhe vetëm atëherë ekzekutohen operatorët që ndjekin këtë bllok.

Në praktikë, pas një blloku provoni, mund të ketë disa blloqe kap, për trajtimin e veçantë të llojeve të ndryshme të gabimeve.

Le të modifikojmë kodin e programit nga mësimi i mëparshëm, të shtojmë kontrollin dhe trajtimin e gabimeve që mund të ndodhin kur përdoruesi fut të dhëna të pasakta.

// Blloku i përpjekjes potencialisht i rrezikshëm (// Kërkoni përdoruesin të fusë numrin e parë Console.Write ("Fut numrin e parë dhe shtyp Enter:"); // Merr vargun e rreshtit të parë firstString = Console.ReadLine (); // Konvertoni rreshtin e parë në numrin int firstArg = Convert.ToInt32 (firstString); // Kërkoni përdoruesin të fusë numrin e dytë Console.Write ("Fut numrin e parë dhe shtyp Enter:"); // Merr vargun e dytë të vargut të dytë String = Console.ReadLine (); // Konvertimi i vargut të dytë në një numër int secondArg = Convert.ToInt32 (secondString); // Shtimi i dy variablave int result = firstArg + secondArg; // Dalja e rezultatit Console.WriteLine ("Rezultati për shtimin e numrave të futur:" + result.ToString ()); ) // Blloku i trajtimit të gabimeve, SystemException është lloji më i zakonshëm i kapjes së gabimeve (SystemException) (Console.WriteLine ("Ndodhi një gabim gjatë ekzekutimit të programit, ndoshta janë futur të dhëna të pasakta!"))

Tani, nëse përdoruesi fut të dhëna të pasakta në vend të një numri të plotë, atëherë gabimi që ka ndodhur do të përpunohet. Nëse e futni këtë kod në " kryesore ", ndërtoni dhe ekzekutoni programin, do të shihni sjelljen e mëposhtme:

Dhe kështu, në këtë mësim u prezantuan informacionet bazë në lidhje me mekanizmin e trajtimit të gabimeve (përjashtimeve) në gjuhën C #. Në mësimin tjetër, ne do të flasim për krijimin dhe përdorimin e metodave (funksioneve) tona dhe do t'i kthehemi temës së trajtimit të gabimeve më shumë se një herë!

Artikujt kryesorë të lidhur