You are on page 1of 20

BO CO C CH BT LI TRONG JAVA V C++

MC LC I. Gii thiu: .............................................................................................................. 2 II. Mc ch:................................................................................................................ 2 III. C ch bt li trong Java v C++: .............................................................. 2
1. C ch bt li trong Java: ................................................................................... 2 1.1. 1.2. X l ngoi l trong Java:.............................................................................. 2 M hnh x l ngoi l trong Java: ............................................................... 2

1.2.1. Cc u im ca m hnh catch v throw:.............................................. 3 1.2.2. Cc khi try v catch: ......................................................................... 3 1.3. 1.4. 1.5. 1.6. 2. 2.1. Cc khi cha nhiu catch: ....................................................................... 5 Khi finally: ................................................................................................ 7 Cc ngoi l c nh ngha vi lnh throw v throws: .................... 9 Danh sch cc ngoi l: ............................................................................... 10 X l li: ....................................................................................................... 11

C ch bt li trong C++: ................................................................................... 11 2.1.1. X l li truyn thng: ............................................................................... 12 2.1.2. Hn ch ca x l li truyn thng: .......................................................... 12 2.2. 2.3. 2.4. Ngoi l trong C++: ..................................................................................... 12 Cc kiu ngoi l trong C++:....................................................................... 13 C ch ngoi l trong C++: ......................................................................... 13

2.4.1. Quy trnh gi hm v tr v trong trng hp bnh thng: .................... 13 2.4.2. Quy trnh nm v bt ngoi l: .................................................................. 14 2.4.3. Nu mt hm khng th bt ngoi l: ........................................................ 14 2.4.4. Nu khng c hm no bt c ngoi l: ................................................ 15 2.5. C php x l ngoi l trong C++: .............................................................. 15 2.5.1. Nm ngoi l (throw): ................................................................................ 15 2.5.2. Khi try-catch: ........................................................................................... 16 2.6. 2.7. So khp ngoi l trong C++: ....................................................................... 17 Lp Exception trong C++: ........................................................................... 18

BO CO C CH BT LI TRONG JAVA V C++

I. Gii thiu:
Exception l mt li c bit. Li ny xut hin vo lc thc thi chng trnh. Cc trng thi khng bnh thng xy ra trong khi thi hnh chng trnh to ra cc exception. Nhng trng thi ny khng c bit trc trong khi ta ang xy dng chng trnh. Nu khng phn phi cc trng thi ny th exception c th b kt thc t ngt.

II. Mc ch:
Mt chng trnh nn c c ch x l ngoi l thch hp. Nu khng, chng trnh s b ngt khi mt exception xy ra. Trong trng hp , tt c cc ngun ti nguyn m h thng trc kia phn phi s c di di trong cng trng thi. iu ny gy lng ph ti nguyn. trnh trng hp ny, tt c cc ngun ti nguyn m h thng phn phi nn c thu hi li. Tin trnh ny i hi c ch x l ngoi l thch hp. Cho v d, xt thao tc nhp xut (I/O) trong mt tp tin. Nu vic chuyn i kiu d liu khng thc hin ng, mt ngoi l s xy ra v chng trnh b hy m khng ng tp tin li. Lc tp tin d b h hi v cc ngun ti nguyn c cp pht cho tp tin khng c thu hi li cho h thng.

III. C ch bt li trong Java v C++:


1. C ch bt li trong Java:
1.1. X l ngoi l trong Java: Khi mt ngoi l xy ra, i tng tng ng vi ngoi l c to ra. i tng ny sau c truyn cho phng thc l ni m ngoi l xy ra. i tng ny cha thng tin chi tit v ngoi l. Thng tin ny c th c nhn v v c x l. Cc mi trng runtime nh IllegalAccessException, EmptyStackException v.v c th chn c cc ngoi l. on m trong chng trnh i khi c th to ra cc ngoi l. Lp throwable c Java cung cp l lp trn nht ca lp Exception, lp ny l lp cha ca cc ngoi l khc nhau. 1.2. M hnh x l ngoi l trong Java: Trong Java, m hnh x l ngoi l kim tra vic x l nhng hiu ng l (li), c bit n l m hnh catch v throw. Trong m hnh ny, khi mt li xy ra, mt ngoi l s b chn v c a vo trong mt khi. Ngi lp trnh vin nn xt cc trng thi ngoi l c lp nhau t vic iu khin thng thng trong chng trnh. Cc ngoi l phi c bt gi nu khng chng trnh s b ngt.

BO CO C CH BT LI TRONG JAVA V C++ Ngn ng Java cung cp 5 t kha sau x l cc ngoi l: try catch throw throws finally

Di y l cu trc ca m hnh x l ngoi l: try { // code d kin s xut hin ngoi l } catch(Exception e1) { // Nu pht hin 1 ngoi l trong khi try thuc e1 th thc hin x l // ngoi l ti y nu khng th xt n khi catch tip theo. } catch(Exception e2) { // Tng t khi catch th nht } catch(Exception eN) { // Tng t khi catch th nht } finally { // Lun thc thi khi lnh ny d c hay khng ngoi l xy ra } 1.2.1. Cc u im ca m hnh catch v throw: M hnh catch v throw c hai u im: Ngi lp trnh vin phi phn phi trng thi li ch vo nhng ni cn thit. Khng cn phi thc hin ti mi mc. Mt thng bo li c th c in ra khi tin hnh x l ngoi l. 1.2.2. Cc khi try v catch: Khi try-catch c s dng thi hnh m hnh catch v throw ca vic x l ngoi l. Khi try cha mt b cc lnh c th thi hnh c. Cc ngoi l c th b chn khi thi hnh nhng cu lnh ny. Phng thc dng chn ngoi l c th c khai bo trong khi try. Mt hay nhiu khi catch c th theo sau khi try. Cc khi catch ny bt cc ngoi l b chn trong khi try. Hy nhn khi try di y:

BO CO C CH BT LI TRONG JAVA V C++ public class ChiaCho0Demo { public static void main(String args[]){ try { int num = calculate(9,0); System.out.println(num); } catch(Exception e) { System.err.println("Co loi xay ra: " + e.toString()); } } static int calculate(int no, int no1){ int num = no / no1; return num; } } y, e l i tng ca lp Exception. Chng ta c th s dng i tng ny in cc chi tit v ngoi l. Phng thc toString c s dng m t exception pht sinh ra. Hnh sau ch ra kt xut ca phng thc toString().

bt gi bt c ngoi l no, ta phi ch ra kiu ngoi l l Exception. catch(Exception e) 4

BO CO C CH BT LI TRONG JAVA V C++ Khi ngoi l b bt gi khng bit thuc kiu no, chng ta c th s dng lp Exception bt ngoi l . 1.3. Cc khi cha nhiu catch: Cc khi cha nhiu catch x l cc kiu ngoi l khc nhau mt cch c lp. Chng c lit k trong on m sau: public class ExceptionTest1 { public static void main(String args[]) throws ExecutionException { try { System.out.print("Nhap canh hinh vuong:"); Scanner num = new Scanner(System.in); int numValue = num.nextInt(); System.out.println("Dien tich hinh vuong la: " + numValue * numValue); } catch (InputMismatchException e2) { System.out.println("Dau vao khong hop le!"); } catch (Exception e) { System.out.println(e.toString()); } } } Trong trng hp ny, khi catch u tin s bt gi mt InputMismatchException. Khi catch th hai s x l kiu ngoi l khc vi khi catch th nht. V y l kt qu ca chng trnh trn:

BO CO C CH BT LI TRONG JAVA V C++

Mt chng trnh cng c th cha cc khi try lng nhau. V d on m di y: try { // on m c th gy ra IOException try { // on m c th gy ra NumberFormatException } catch (NumberFormatException e1) { // X l li sai nh dng s } } catch (IOException e2) { // X l li vo ra }

BO CO C CH BT LI TRONG JAVA V C++ Khi s dng cc try lng nhau, khi try bn trong c thi hnh u tin. Bt k ngoi l no b chn trong khi try s b bt gi trong cc khi catch theo sau. Nu khi catch thch hp khng c tm thy th cc khi catch ca cc khi try bn ngoi s c xem xt. Nu khng, Java Runtime Environment x l cc ngoi l. 1.4. Khi finally: Khi mt ngoi l xut hin, phng thc ang c thc thi c th b dng m khng c thi hnh ton vn. Nu iu ny xy ra, th cc on m (v d nh on m vi chc nng thu hi ti nguyn c cc lnh ng li tp tin khai bo cui phng thc) s khng bao gi c gi. Java cung cp khi finally gii quyt vic ny. Khi finally thc hin tt c cc vic thu dn cho mt ngoi l xy ra. Khi ny c th c s dng kt hp vi khi try. Khi finally cha cc cu lnh thu hi ti nguyn v cho h thng hay lnh in ra cc cu thng bo. Cc lnh ny bao gm: ng tp tin. ng li b kt qu (c s dng trong chng trnh c s d liu). ng li cc kt ni c to trong c s d liu. try { doSomethingThatMightThrowAnException(); } finally { cleanup(); } Phng thc cleanup() c gi nu phng thc doSomethingThatMightThrowAnException() chn mt ngoi l. Mt khc cleanup cng c gi ngay khi khng c ngoi l no b chn v thi hnh tip tc sau khi lnh finally. Khi lnh finally l ty , khng bt buc. Khi ny c t sau khi catch. H thng s duyt t cu lnh u tin ca khi finally sau khi gp cu lnh return hay lnh break c dng trong khi try. Khi finally m bo lc no cng c thc thi, bt chp c ngoi l xy ra hay khng. Hnh di y minh ha s thi hnh ca cc khi try, catch v finally:

BO CO C CH BT LI TRONG JAVA V C++

Ta xt v d sau y: public class ExceptionTest2 { static String str; public static void main(String s[]) { try { System.out.println("Truoc ngoai le"); staticLengthmethod(); System.out.println("Sau ngoai le"); } catch (NullPointerException ne) { System.out.println("Da xay ra loi"); } finally { System.out.println("Trong finally"); } } static void staticLengthmethod() { System.out.println(str.length()); } }

BO CO C CH BT LI TRONG JAVA V C++ V y l kt qu khi chy chng trnh:

Trong v d ny, cu lnh trong khi finally lun lun thi hnh, bt chp ngoi l c xy ra hay khng. Trong kt xut trn, khi finally vn c thi hnh mc d ngoi l vn xy ra. 1.5. Cc ngoi l c nh ngha vi lnh throw v throws: Cc ngoi l b chn vi s tr gip ca cc t kha throw. T kha throw ch ra mt ngoi l va xy ra. Ton t ca throw l mt i tng ca lp, lp ny c dn xut t throwable. Mt phng thc n c th chn nhiu ngoi l. x l nhng ngoi l ny, ta cn cung cp mt danh sch cc ngoi l m phng thc chn trong phn nh ngha ca phng thc. Gi s rng phng thc x() gi phng thc y(). Phng thc y() chn mt ngoi l khng c x l. Trong trng hp ny, phng thc gi x() nn khai bo vic chn cng mt ngoi l vi phng thc c gi y(). Ta nn khai bo khi try-catch trong phng thc x() m bo rng ngoi l khng c truyn cho cc phng thc m gi phng thc ny. on lnh sau ch cch s dng ca lnh throw: public class ExceptionTest3 { public static void main(String args[]) { try { int num = calculate(9, 3); System.out.println("Lan 1: " + num);

BO CO C CH BT LI TRONG JAVA V C++ num = calculate(9, 0); System.out.println("Lan 2: " + num); } catch (Exception e) { System.out.println(e.getMessage()); } } static int calculate(int no, int no1) throws ArithmeticException { if (no1 == 0) throw new ArithmeticException("Khong the chia cho 0!"); int num = no / no1; return num; } } Trong v d trn, phng thc calculate c khai bo t kha throws. T kho ny c theo sau bi cc ngoi l m phng thc ny c th chn, trong trng hp ny l ArithmeticException. 1.6. Danh sch cc ngoi l: Bng sau y lit k mt s ngoi l: Ngoi l RuntimeException ArthmeticException IllegalAccessException IllegalArgumentException ArrayIndexOutOfBoundsException NullPointerException SecurityException ClassNotFoundException NumberFormatException AWTException Lp cha ca th t phn cp ngoi l Lp c s cho nhiu ngoi l java.lang Trng thi li v s Lp khng th truy cp. Phng thc nhn mt i s khng hp l Kch thc ca mng ln hn 0 hay ln hn kch thc tht s ca mng Khi mun truy cp i tng null Vic thit lp c ch bo mt khng c hot ng Khng th np lp yu cu Vic chuyn i s khng thnh cng t chui sang s thc Ngoi l v AWT

10

BO CO C CH BT LI TRONG JAVA V C++ IOException FileNotFoundException EOFException NoSuchMethodException InterruptedException Lp cha ca cc ngoi l I/O Khng th nh v tp tin Kt thc mt tp tin Phng thc yu cu khng tn ti Khi mt lung b ngt

Tm tt:
Bt c khi no mt li xut hin trong khi thi hnh chng trnh, ngha l mt ngoi l xut hin. Ngoi l pht sinh vo lc thc thi chng trnh theo trnh t m. Mi ngoi l pht sinh ra phi b bt gi, nu khng ng dng s b ngt. Vic s l ngoi l cho php bn kt hp tt c tin trnh x l li trong mt ni. Lc on m ca bn s r rng hn. Java s dng khi try - catch x l cc ngoi l. Cc cu lnh trong khi try chn ngoi l, cn khi catch x l ngoi l. Cc khi cha nhiu catch c th c s dng x l cc kiu ngoi l khc theo cch khc nhau. T kha throw lit k cc ngoi l m phng thc chn. T kha throw ch ra mt ngoi l va xut hin. Khi finally khai bo cc cu lnh tr v ngun ti nguyn cho h thng v in nhng cu thng bo.

2. C ch bt li trong C++:
2.1. X l li: Chng trnh no cng c kh nng gp phi cc tnh hung khng mong mun. C th do nhng nguyn nhn sau y: Ngi dng nhp d liu khng hp l, a cng b y, File cn m b kha, i s cho hm khng hp l,...

X l nh th no? Mt chng trnh khng quan trng c th dng li, Chng trnh iu khin khng lu? iu khin my bay? on chng trnh x l li c bn: double MyDivide(double numerator, double denominator) { if (denominator == 0.0) {

11

BO CO C CH BT LI TRONG JAVA V C++ printf("Loi! Mau so khong the bang 0\n"); exit(0); } else { return numerator / denominator; } } M th vin (ni gp li) thng khng c thng tin x l li. Do vy, cn c c ch m th vin bo cho m ng dng rng n v mt l do no khng th tip tc chy c, m ng dng x l ty theo tnh hung. 2.1.1. X l li truyn thng: X l li truyn thng thng l mi hm li thng bo trng thi thnh cng/tht bi qua mt m li. Chng hn: Bin ton cc (chng hn error). Gi tr tr v. int remove(const char *filename); Tham s ph l tham chiu double MyDivide(double numerator, double denominator, int &status); 2.1.2. Hn ch ca x l li truyn thng: Phi c lnh kim tra li sau mi li gi hm code trng ri rm, di, kh c, Lp trnh vin ng dng qun kim tra, hoc c tnh b qua: Bn cht con ngi, Lp trnh vin ng dng thng khng c kinh nghim bng lp trnh vin th vin. Rc ri khi y thng bo li t hm c gi sang hm gi v t mt hm ta ch c th tr v mt kiu thng bo li. 2.2. Ngoi l trong C++: Ngoi l l c ch thng bo v x l li gii quyt c cc vn k trn. Tch c phn x l li ra khi phn thut ton chnh. Cho php 1 hm thng bo v nhiu loi ngoi l. Khng phi hm no cng phi x l li nu c mt s hm gi thnh chui, ngoi l ch ln c x l ti mt hm l .

12

BO CO C CH BT LI TRONG JAVA V C++ Khng th b qua ngoi l, nu khng, chng trnh s kt thc. C ch ngoi l mm do hn kiu x l li truyn thng. 2.3. Cc kiu ngoi l trong C++: Mt ngoi l l mt i tng cha thng tin v mt li v c dng truyn thng tin ti cp thc thi cao hn. Ngoi l c th thuc kiu d liu bt k ca C++: Kiu d liu c sn, chng hn: int, char*, Kiu d liu ngi dng t nh ngha (thng dng). Cc lp ngoi l trong th vin <exception>. 2.4. C ch ngoi l trong C++: Qu trnh truyn ngoi l t ng cnh thc thi hin hnh ti mc thc thi cao hn gi l nm mt ngoi l (throw an exception). V tr trong m ca hm ni ngoi l c nm c gi l im nm (throw point). Khi mt ng cnh thc thi tip nhn v truy nhp mt ngoi l, n c coi l bt ngoi l (catch the exception). 2.4.1. Quy trnh gi hm v tr v trong trng hp bnh thng:

void main() { int x, y;

13

BO CO C CH BT LI TRONG JAVA V C++ cout << "Nhap 2 so:"; cin >> x >> y; cout << "Ket qua chia so thu nhat cho thu hai: "; cout << MyDivide(x, y) << "\n"; } 2.4.2. Quy trnh nm v bt ngoi l:

Gi s ngi dng nhp mu s bng 0. M chng trnh trong MyDivide() to mt ngoi l (bng cch no ) v nm. Khi mt hm nm mt ngoi l, n lp tc kt thc thc thi v gi ngoi l cho ni gi n. main() s bt v gii quyt ngoi l. Chng hn yu cu ngi dng nhp li mu s. 2.4.3. Nu mt hm khng th bt ngoi l:

14

BO CO C CH BT LI TRONG JAVA V C++ Gi s hm MyLazyDivide() khng th bt ngoi l do MyDivide() nm. Khng phi hm no bt c ngoi l cng c th bt c mi loi ngoi l. Chng hn hm f() bt c cc ngoi l loi E1 nhng khng bt c cc ngoi l loi E2. Ngoi l s c chuyn ln mc trn cho main() bt. 2.4.4. Nu khng c hm no bt c ngoi l: Nu c mt ngoi l c nm, n s c chuyn qua tt c cc hm. Ti mc thc thi cao nht, chng trnh tng (ni gi hm main()) s bt mi ngoi l cn st li m n nhn thy. Khi , chng trnh lp tc kt thc. 2.5. C php x l ngoi l trong C++: C ch x l ngoi l ca C++ c 3 tnh nng chnh: Kh nng to v nm ngoi l (s dng t kho throw). Kh nng tch logic x l ngoi l trong mt hm ra khi phn cn li ca hm (s dng t kho try). Kh nng bt v gii quyt ngoi l (s dng t kho catch). 2.5.1. Nm ngoi l (throw): nm mt ngoi l, ta dng t kho throw, km theo i tng m ta nh nm: throw <object>; Ta c th dng mi th lm ngoi l, k c gi tr thuc kiu d liu c sn: throw 15; throw MyObj(); V d, MyDivide() nm ngoi l l mt string: double MyDivide(double numerator, double denominator) { if (denominator == 0.0) { throw string("Loi! Mau so khong the bang 0"); exit(0); } else { return numerator / denominator; } } Trong trng hp cn cung cp nhiu thng tin hn cho hm gi, ta to mt class dnh ring cho cc ngoi l: class MyException { int a, b; public: MyException(int a, int b);

15

BO CO C CH BT LI TRONG JAVA V C++ ~MyException(); int getA(); int getB(); }; int x, y; ... if (...) throw MyException(x, y); ... 2.5.2. Khi try-catch: Khi try-catch dng : Tch phn gii quyt li ra khi phn c th sinh li. Quy nh cc loi ngoi l c bt ti mc thc thi hin hnh. C php chung cho khi try-catch: try { // Code that could generate an exception } catch (<Type of exception>) { // Code that resolves an exception of that type }; M lin quan n thut ton nm trong khi try, M gii quyt li t trong (cc) khi catch. C th c nhiu khi catch, mi khi cha m gii quyt mt loi ngoi l c th: try { // Code that could generate an exception } catch (<exception type1>) { // Code that resolves a type1 exception } catch (<exception type2>) { // Code that resolves a type2 exception } ... catch (<exception typeN>) { // Code that resolves a typeN exception }; Du chm phy nh du kt thc ca ton khi try-catch. V d: void main() { int x, y; double result;

16

BO CO C CH BT LI TRONG JAVA V C++ cout << "Nhap 2 so:"; cin >> x >> y; try { result = MyDivide(x, y); } catch (string &s) { //resolve error }; cout << "Ket qua chia so thu nhat cho thu hai: "; cout << result << "\n"; } MyDevide nm ngoi l l mt string, Gii quyt li? Gii quyt li: void main() { int x, y; double result; bool success; do { success = true; cout << "Nhap 2 so:"; cin >> x >> y; try { result = MyDivide(x, y); } catch (string& s) { cout << s << endl; success = false; }; } while (success == false); cout << "Ket qua chia so thu nhat cho thu hai: "; cout << result << "\n"; } 2.6. So khp ngoi l trong C++: Khi mt ngoi l c nm t trong mt khi try, h thng x l ngoi l s kim tra cc kiu c lit k trong khi catch theo th t lit k: Khi tm thy kiu n khp, ngoi l c coi l c gii quyt, khng cn tip tc tm kim, Nu khng tm thy, mc thc thi hin hnh b kt thc, ngoi l c chuyn ln mc cao hn.

17

BO CO C CH BT LI TRONG JAVA V C++ Khi tm cc kiu d liu khp vi ngoi l, trnh bin dch ni chung s khng thc hin i kiu t ng: Nu mt ngoi l kiu float c nm, n s khng khp vi mt khi catch cho ngoi l kiu int. Mt i tng hoc tham chiu kiu dn xut s khp vi mt lnh catch dnh cho kiu c s: Nu mt ngoi l kiu Car c nm, n s khp vi mt khi catch cho ngoi l kiu Vehicle: try {} catch (Vehicle &vehicle) {} catch (Car &c) {} catch (Truck &t) {}; Mi ngoi l l i tng c sinh t cy Vehicle s khp lnh catch u tin (cc lnh cn li s khng bao gi chy). Nu mun bt cc ngoi l dn xut tch khi ngoi l c s, ta phi xp lnh catch cho lp dn xut ln trc: try {} catch (Car &c) {} catch (Truck &t) {} catch (Vehicle &vehicle) {}; Nu mun bt tt c cc ngoi l c nm, ta t du ba chm bn trong lnh catch: catch (...) {}; Do tham s ba chm bt c mi ngoi l, ta ch nn s dng n cho lnh catch cui cng trong mt khi try-catch: catch (<exception type1>) {} catch (<exception type2>) {} catch (<exception typeN>) {} catch (...) {}; 2.7. Lp Exception trong C++: tch hp hn na cc ngoi l vo ngn ng C++, lp exception c a vo th vin chun. S dng th vin ny, ta c th nm cc th hin ca exception hoc to cc lp dn xut t . Lp exception c mt hm o what(), c th nh ngha li what() tr v mt xu k t: try {} catch (exception e) { cout << e.what(); }

18

BO CO C CH BT LI TRONG JAVA V C++ Mt s lp ngoi l chun khc c dn xut t lp c s exception. File header <stdexcept> (cng thuc th vin chun C++) cha mt s lp ngoi l dn xut t exception: File ny cng #include <exception> nn khi dng khng cn #include c hai, Trong c hai lp quan trng c dn xut trc tip t exception: runtime_error & logic_error. runtime_error: Dng i din cho cc li trong thi gian chy (cc li l kt qu ca cc tnh hung khng mong i, chng hn: ht b nh), Gm cc lp lp dn xut sau: range_error: iu kin sau (post-condition) b vi phm, overflow_error: xy ra trn s hc, bad_alloc: khng th cp pht b nh. logic_error: Dng cho cc li trong lgic chng trnh (chng hn truyn tham s khng hp l), Gm cc lp lp dn xut sau: domain_error: iu kin trc (pre-condition) b vi phm, invalid_argument: tham s khng hp l c truyn cho hm, length_error: to i tng ln hn di cho php, out_of_range: tham s ngoi khong (chng hn ch s khng hp l). V d: Vit li hm MyDivide() s dng cc ngoi l chun: double MyDivide(double numerator, double denominator) { if (denominator == 0.0) { throw invalid_argument("Loi! Mau so khong the bang 0"); exit(0); } else { return numerator / denominator; } } Sa lnh catch c bt c ngoi l kiu invalid_argument (thay cho kiu string trong phin bn trc): void main() { int x, y; double result; do { cout << "Nhap 2 so:"; cin >> x >> y; try {

19

BO CO C CH BT LI TRONG JAVA V C++ result = MyDivide(x, y); } catch (invalid_argument &e) { cout << e.what() << endl; continue; //Restart the loop }; } while (0); cout << "Ket qua chia so thu nhat cho thu hai: "; cout<< result << "\n"; }

20

You might also like