error handle-oop(รูปแบบและลักษณะการ error...
DESCRIPTION
ความเข้าใจปัญหาการ error ในโปรแกรมและการป้องกันการเกิด error ในลักษณะการดักจับ ErrorTRANSCRIPT
1
การจั�ดการความผิ�ดพลาด
Error Handling
@wong::The hard core idea system
2
ว�ตถุ�ประสงค�
เพ��อศึ�กษาประเภทของข อผิ�ดพลาดเพ��อศึ�กษาการเก�ดและการควบค�มข อผิ�ดพลาดเพ��อศึ�กษาการจั�ดการข อผิ�ดพลาด
3
ประเภทของข อผิ�ดพลาด
Syntax ErrorRun-Time ErrorLogical Error
4
Syntax Error
เป#นการผิ�ดพลายชน�ดร ายแรง เน��องจัากผิ�ดหล�กหร�อโครงสร างของภาษา (Syntax or
Symmetric) ความผิ�ดพลาดประเภทน*+ไม-สามารถุคอมไพล�ได เลย เช-น การไม-ได ป.ดค/าส��งด วย ; เช-น System.out.Print(“Hello”)
5
Run – Time Error
เป#นความผิ�ดพลาดท*�ไม-ร ายแรง ความผิ�ดพลาดประเภทน*+โปรแกรมสามารถุคอมไพล�ได แต- run ไม-ได เช-น การหารด วย 0 หร�อการอ างขอบเขตของ Array เก�นกว-าท*�ก/าหนดไว
1. class TestError {2. public static void main(String s[]){3. System.out.Print(“Hello” +s[0]);4. }5. }
6
Logical Error
เป#นความผิ�ดพลาดท*�ตรวจัพบยากมากเน��องจัากโปรแกรมสามารถุท/างานได ตามปกต�แต-ผิลล�พธ์�ท*�ออกน�+นไม-ตรงก�บความเป#นจัร�ง หร�อให ผิลล�พธ์�ท*�ไม-สอดคล องก�น เด�อนก�มภาพ�นธ์� ม* 30 ว�น เป#นต น
7
การเก�ด Error
โดยส-วนมากแล วการเก�ด Error ในโปรแกรมน�+นสาเหต�ใหญ่- ค�อ การเก�ดจัากมน�ษย� ไม-ว-าจัะเป#น Error อย-างใดก3ตาม ด�งน*+ จั�ดท*�สามารถุป4องก�น Error เหล-า
น*+จั�งสามารถุท/าได ต�+งแต-การว�เคราะห�หร�อการท/าความเข าใจัก�บระบบงานเด�ม จันกระท��งถุ�งการ
ตรวจัสอบระบบงาน แต-อย-างไรก3ตามกลไกของภาษาเองก3สามารถุช-วยในการตรวจัสอบความผิ�ดพลาดได ต�+งแต-ในระด�บของ Syntax Error และ Run-Time Error โดยอาจัแจั งในร5ปของ Error หร�อ warning
ตามล/าด�บ
8
กลไกการตรวจัสอบ
ในภาษา assembly จัะม*ค/าส��ง Interrupt ซึ่��งม*การท/างานด�งน*+
interrupt
Process to handle interrupt
9
ป7ญ่หาการน/า Interrupt ไปใช ในภาษาระด�บส5งในภาษาระด�บส5งบางคร�+งการเก�ด Interrupt น�+นไม-
สามารถุบอกได ว-าเก�ดข�+น ณ ท*�ใดและเม��อม*การหย�ดการท/างานแล ว ม*การHandle เร*ยบร อยแล ว การกล�บมาท/างานบางคร�+งไม-สามารถุกล�บมาท/างานในต/าแหน-งท*�หย�ดได
ภาษระด�บส5งท*�ใช interpreter ก3อาจัสามารถุใช Interrupt ได เช-นใน Basic ท�+งน*+เน��องจัาก Operation ของภาษาระด�บส5งค�อประโยค ท�+งน*+จัากการแปลภาษาท*�แปลท*ละบรรท�ดจั�งร�บร5 ว-าบรรท�ดไหนท*�ม*ความผิ�ดพลาดเก�ดข�+น
10
กลไกการตรวจัสอบในภาษาข�+นส5งในภาษาข�+นส5งเองก3ม*กลไกการจั�ดการและการตรวจั
สอบเช-นเด*ยวก�นก�บ assembly ซึ่��งจัะอ/านวยความสะดวกอย-างมากในการเข*ยนโปรแกรม เช-น ในภาษา
Ada เองก3ม* Exception
ซึ่��งจัะเป#นล�กษณะของ Static Exception
กล-าวค�อ เม��อโปรแกรม(อย5-ภายใต begin –
end block) ท/างานถุ�งจั�ดท*�ผิ�ดพลาด ก3จัะเร*ยกใช หร�อใช งานการ when Exception ท*�
ตรง ก�บ Exception ท*�เก�ดข�+น เม��อท/างานเสร3จั แล วก3จัะไปย�งค/าส��ง end เพ��อท/างานต-อ
begin <Statements>exception when exception1 = > <Statements> ; when exception1 = > <Statements> ; other => <Statements> ; end;
11
กลไกการตรวจัสอบของภาษาจัาวา
จัาวาได ร�บเอา Exception Handling เข ามาเป#นส-วนหน��งของภาษาโดยคอมไพเลอร�จัะท/าการตรวจัสอบการใช งาน exception handling อย-างเคร-งคร�ด ซึ่��งภาษาจัาวาม*ร5ปแบบการใช งาน exception ด�งน*+
try {<statements>;}
catch (Throwable1 t) {<statements>;}
catch (Throwable2 t) {<statements>;}
catch (Throwable3 t) {<statements>;}
12
การท/างาน exception handling
จัะคล ายก�บ Ada น�+นค�อ ประโยคท*�อย5-ใน try block น�+นจัะเป#นประโยคท*�ท/างานตามปกต� หากท/างานจันจับประโยค โดยไม-ม*ความผิ�ดพลาดเก�ดข�+น ก3จัะท/างานท*�ค/าส��งหล�งประโยค catch block อ�นส�ดท าย แต-ถุ าหากม* error เก�ดข�+นใน try block โปรแกรมจัะหย�ดท/างานท*�บรรท�ดน�+น แล วสร าง instance ของ error หร�อ exception และ throws ไปย�งต/าแหน-งท*�ม*ความผิ�ดพลาดถุ าประโยคท*�ม*ความผิ�ดพลาดน�+นม* catch block ท*�ม*ค-าพาราม�เตอร�ตรงก�บ exception ท*�เก�ดข�+นประโยคใน catch block น�+นก3ถุ5กท/างาน จัากน�+นโปรแกรมจัะท/างานในค/าส��งหล�งประโยค catch block อ�นส�ดท าย
13
การท/างาน exception handling
หาก exception ท*�ถุ5ก throws ออกมาจัากประโยคใน try block ท*�ไม-ม* catch block ด�กจั�บ exception จัะถุ5กส-งออกมาจัากเมธ์อดท*�เก�ดความผิ�ดพลาดไปย�งเมธ์อดท*�เร*ยกใช งาน ซึ่��งเร*ยกว-า exception propagation ถุ าเมธ์อดท*�เร*ยกใช น�+นม*การจั�บ exception น�+นไปจั�ดการขบวนการก3ส�+นส�ด แต-ถุ าไม-ม*ก3จัะเก�ด propagation ไปเร��อย ๆ จันถุ า exception ออกจัาก main แล วก3จัะถุ5ก java interpreter จั�ดการ ด�งน*+
1 .พ�มพ� exception
2. พ�มพ� activation stack เพ��อให ร5 ถุ�งจั�ดก/าเน�ดและเส นทาง propagation
3. หย�ดการท/างานของ JVM
14
main()
Method 1
Method 2
call
call
Exception
Exception
พ�มพ� exceptionพ�มพ� activation
stack หย�ดการท/างาน
ของ JVM
15
main()
Method 1
Method 2
call
call
Exception
ด/าเน�นการตามท*�ได ด�กจั�บ Exception
16
ข อแตกต-างระหว-าง Interrupt และ ExceptionInterrupt น�+นสามารถุเก�ดข�+นท*�เวลาใดก3ได บรรท�ดใดก3ได Exception น�+นเก�ดข�+นก�บประโยคบางประเภทบางล�กษณะ
เท-าน�+น
ประโยชน�ท/าให การเข*ยนน�+นโปรแกรมน�+นง-ายข�+นเน��องจัากม*การ
จั/าแนกและคาดการณ�ล-วงหน าถุ�งค/าส��งท*�จัะเก�ด error ได ง-าย
ข อเส*ยOverhead ส5ง
17
ต�วอย-าง
1. class ArrayOut {
2. public static void main(String s []) {
3. System.out.println("Hello " + s[0]);
4. }
5. }
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 0 at ArrayOut.main(ArrayOut.java:3)
18
การเพ��ม exception handling
1. class ArrayOut {2. public static void main(String s []) {3. try 4. { System.out.println("Hello " + s[0]); } 5. catch (ArrayIndexOutOfBoundsException e)6. { System.out.println("Please try again" +7. "with command line"); }8. }9. }
19
ต�วอย-าง
1. class TestExcep {2. static void f(){int x = 0; float y = 1/x; }3. public static void main(String s[]){4. try{5. f(); 6. }catch (Exception e){7. System.out.println("Error
divice by 0" + e.getMessage());}8. }9. }
20
Throw Statements
ใช ส/าหร�บการโยน exception ในต/าแหน-งท*�ต องการออกมาออกมา throw จัะตามด วย instance ของ exception ท*�จัะถุ5กโยน หาก instance น�+นม*อย5-ก-อนก3สามารถุโยนออกมาได เลย แต-ถุ าไม-ม*ต องท/าการสร างข�+นมาด วยค/าส��ง new ก-อน ค/าส��ง throw น�+นอาจัอย5-ใน try block ท*ม*การด�กจั�บ exception หร�อไม-ก3อย5-ใน method ท*�ม*การระบ�ว-าจัะส-ง exception น�+นออกมา
21
ต�วอย-าง1. class ThrowTest {2. static int div(int x, int y){3. try {4. if (y == 0)5. throw new Exception();6. return x/y;7. } catch (Exception e){return x/y;}8. }9. public static void main(String s[ ]){10. System.out.println(div(1,0));}11.}
22
Method that throws exception
ค�อการระบ�หร�อคาดหมายว-า method น�+นจัะม*การ throws exception ออกมา โดยเราจัะใช ค/าส��ง throws หล�งวงเล3บของพาราม�เตอร�ตามด วย class ของ exception ท*�อาจัถุ5กโยนออกมา
23
ต�วอย-าง
1. class MethodThrows {2. static int div(int x, int y) throws
ArithmeticException {3. return x/y; }4. public static void main(String s[]){5. System.out.println(div(1,0));6. }7. }
24
ต�วอย-าง1. import java.lang.* ; 2. import java.io.* ; 3. public class Square { 4. public static void main ( String[] a ) throws IOException { 5. BufferedReader stdin = new BufferedReader (new
InputStreamReader( System.in) ); 6. String inData; 7. int num ; 8. System.out.println("Enter an integer:"); 9. inData = stdin.readLine(); 10. num = Integer.parseInt( inData ); // convert inData to int11. System.out.println("The square of " + inData + " is " + num*num ); } }
25
Finally block
ค�อบล3อกท*�เป#น option ว-าม*หร�อไม-ก3ได ถุ าม*ม*ได เพ*ยง 1 block เป#นบล3อกท*�ท/างานเสมอ ไม-ว-าโปรแกรมจัะผิ-าน try หร�อ catch block หร�อไม-
try { <statements>; }
catch (<parameter>){ <statements>; }
finally{ <statements>; }
26
1. class ArrayOut {
2. public static void main(String s []) {
3. try
4. { System.out.println("Hello " + s[0]); }
5. catch (ArrayIndexOutOfBoundsException e)
6. { System.out.println("Please try again" +
7. "with command line"); }
8. finally
9. {System.out.println("How are you. ");}
10. }
11. }