KEMBAR78
Error handle-OOP(รูปแบบและลักษณะการ Error ในโปรแกรม) | PPT
การจัดการความ
ผิดพลาด
Error Handling

@wong::The hard core idea
system
1
วัตถุประสงค์
เพื่อศึกษาประเภทของข้อผิดพลาด
เพื่อศึกษาการเกิดและการควบคุมข้อผิดพลาด
เพื่อศึกษาการจัดการข้อผิดพลาด

2
ประเภทของข้อผิดพลาด
Syntax Error
Run-Time Error
Logical Error

3
Syntax Error
เป็นการผิดพลายชนิดร้ายแรง เนื่องจากผิดหลัก
หรือโครงสร้างของภาษา (Syntax or
Symmetric) ความผิดพลาดประเภทนี้ไม่
สามารถคอมไพล์ได้เลย เช่น การไม่ได้ปดคำาสั่ง
ิ
ด้วย ; เช่น
System.out.Print(“Hello”)

4
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. }

5
Logical Error
 เป็นความผิดพลาดที่ตรวจพบยากมากเนืองจาก
่
โปรแกรมสามารถทำางานได้ตามปกติแต่ผลลัพธ์
ที่ออกนันไม่ตรงกับความเป็นจริง หรือให้
้
ผลลัพธ์ที่ไม่สอดคล้องกัน เดือนกุมภาพันธ์ มี
30 วัน เป็นต้น

6
การเกิด Error
โดยส่วนมากแล้วการเกิด Error ในโปรแกรม
นั้นสาเหตุใหญ่ คือ การเกิดจากมนุษย์ ไม่ว่าจะ
เป็น Error อย่างใดก็ตาม ดังนี้ จุดที่สามารถ
ป้องกัน Error เหล่านี้จึงสามารถทำาได้ ตั้งแต่
การวิเคราะห์หรือการทำาความเข้าใจกับระบบ
งานเดิม จนกระทั่งถึงการตรวจสอบระบบงาน
แต่อย่างไรก็ตามกลไกของภาษาเองก็สามารถ
ช่วยในการตรวจสอบความผิดพลาดได้ ตั้งแต่
ในระดับของ Syntax Error และ Run-Time
Error โดยอาจแจ้งในรูปของ Error หรือ

7
กลไกการตรวจสอบ
ในภาษา assembly จะมีคำาสั่ง Interrupt ซึ่งมี
การทำางานดังนี้
Process to handle
interrupt

interrupt

8
ปัญหาการนำา Interrupt ไปใช้ในภาษา
ระดับสูง
ในภาษาระดับสูงบางครั้งการเกิด Interrupt นั้น
ไม่สามารถบอกได้ว่าเกิดขึ้น ณ ที่ใดและเมื่อมี
การหยุดการทำางานแล้ว มีการHandle
เรียบร้อยแล้ว การกลับมาทำางานบางครั้งไม่
สามารถกลับมาทำางานในตำาแหน่งที่หยุดได้
ภาษระดับสูงที่ใช้ interpreter ก็อาจสามารถใช้
Interrupt ได้ เช่นใน Basic ทั้งนี้เนืองจาก
่
Operation ของภาษาระดับสูงคือประโยค ทั้งนี้
จากการแปลภาษาที่แปลทีละบรรทัดจึงรับรู้ว่า
บรรทัดไหนที่มีความผิดพลาดเกิดขึ้น

9
กลไกการตรวจสอบในภาษาขั้นสูง
ในภาษาขั้นสูงเองก็มีกลไกการจัดการและการ
ตรวจสอบเช่นเดียวกันกับ assembly ซึ่งจะอำานวย
ความสะดวกอย่างมากในการเขียนโปรแกรม เช่น
ในภาษา Ada เองก็มี Exception
begin
<Statements>
ซึ่งจะเป็นลักษณะของ Static Exception
exception
when exception1 = >
กล่าวคือ เมื่อโปรแกรม(อยู่ภายใต้ begin – ;
<Statements>
when exception1 = >
end block) ทำางานถึงจุดที่ผิดพลาด ก็จะเรียก ;
<Statements>
other =>
ใช้หรือใช้งานการ when Exception ที่
<Statements> ;
end;
ตรง
กับ Exception ที่เกิดขึ้น เมื่อทำางาน
เสร็จ
แล้วก็จะไปยังคำาสั่ง end เพื่อทำางานต่อ
10
กลไกการตรวจสอบของภาษาจาวา
จาวาได้รับเอา Exception Handling เข้ามา
เป็นส่วนหนึ่งของภาษาโดยคอมไพเลอร์จะ
ทำาการตรวจสอบการใช้งาน exception
handling อย่างเคร่งครัด try่ง{
ซึ ภาษาจาวามีรูป
แบบการใช้งาน exception ดังนี้
<statements>;}
catch (Throwable1 t) {
<statements>;}
catch (Throwable2 t) {
<statements>;}
catch (Throwable3 t) {
<statements>;}

11
การทำางาน exception handling
จะคล้ายกับ Ada นั้นคือ ประโยคที่อยู่ใน try
block นั้นจะเป็นประโยคที่ทำางานตามปกติ หาก
ทำางานจนจบประโยค โดยไม่มีความผิดพลาด
เกิดขึ้น ก็จะทำางานที่คำาสั่งหลังประโยค catch
block อันสุดท้าย แต่ถ้าหากมี error เกิดขึ้นใน
try block โปรแกรมจะหยุดทำางานที่บรรทัดนั้น
แล้วสร้าง instance ของ error หรือ exception
และ throws ไปยังตำาแหน่งที่มีความผิดพลาดถ้า
ประโยคที่มีความผิดพลาดนั้นมี catch block ที่
มีคาพารามิเตอร์ตรงกับ exception ที่เกิดขึ้น
่
ประโยคใน catch block นันก็ถูกทำางาน จาก
้
นั้นโปรแกรมจะทำางานในคำาสั่งหลังประโยค

12
การทำางาน exception handling
 หาก exception ที่ถูก throws ออกมาจาก
ประโยคใน try block ที่ไม่มี catch block ดัก
จับ exception จะถูกส่งออกมาจากเมธอดที่
เกิดความผิดพลาดไปยังเมธอดที่เรียกใช้งาน
ซึ่งเรียกว่า exception propagation ถ้า
เมธอดที่เรียกใช้นั้นมีการจับ exception นั้น
ไปจัดการขบวนการก็สิ้นสุด แต่ถ้าไม่มีก็จะเกิด
propagation ไปเรื่อย ๆ จนถ้า exception
ออกจาก main แล้วก็จะถูก java interpreter
จัดการ ดังนี้
1. พิมพ์ exception
13
2. พิมพ์ activation stack เพือให้รู้ถึงจุดกำาเนิดและเส้นทาง
่
main()
call

พิมพ์ exception
พิมพ์ activation
stack
หยุดการทำางาน
ของ JVM
Exception

Method 1
call

Exception

Method 2
14
ดำำเนินกำรตำมทีได้ดักจับ
่
Exception

main()
call

Exception

Method 1
call

Method 2
15
ข้อแตกต่ำงระหว่ำง Interrupt และ
Exception
Interrupt นั้นสำมำรถเกิดขึ้นที่เวลำใดก็ได้
บรรทัดใดก็ได้
Exception นั้นเกิดขึ้นกับประโยคบำงประเภท
บำงลักษณะเท่ำนั้น

ประโยชน์
ทำำให้กำรเขียนนั้นโปรแกรมนั้นง่ำยขึ้น
เนื่องจำกมีกำรจำำแนกและคำดกำรณ์ล่วงหน้ำถึง
คำำสังที่จะเกิด error ได้ง่ำย
่

16
ตัวอย่ำง
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)

17
กำรเพิ่ม 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. }
18
ตัวอย่ำง
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. }
19
Throw Statements
ใช้สำำหรับกำรโยน exception ในตำำแหน่งที่
ต้องกำรออกมำออกมำ throw จะตำมด้วย
instance ของ exception ที่จะถูกโยน หำก
instance นั้นมีอยู่ก่อนก็สำมำรถโยนออกมำได้
เลย แต่ถ้ำไม่มีต้องทำำกำรสร้ำงขึ้นมำด้วยคำำสั่ง
new ก่อน คำำสัง throw นั้นอำจอยู่ใน try block
่
ทีมีกำรดักจับ exception หรือไม่ก็อยู่ใน
method ที่มีกำรระบุว่ำจะส่ง exception นั้น
ออกมำ
20
ตัวอย่ำง
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.}

21
Method that throws exception
คือการระบุหรือคาดหมายว่า method นั้นจะมี
การ throws exception ออกมา โดยเราจะใช้
คำาสัง throws หลังวงเล็บของพารามิเตอร์ตาม
่
ด้วย class ของ exception ที่อาจถูกโยนออก
มา

22
ตัวอย่าง
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. }

23
ตัวอย่าง
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 int
11.
System.out.println("The square of " + inData + " is " +
num*num ); } }
24
Finally block
คือบล็อกที่เป็น option ว่ามีหรือไม่ก็ได้ ถ้ามีมี
ได้เพียง 1 block เป็นบล็อกที่ทำางานเสมอ ไม่ว่า
โปรแกรมจะผ่าน try หรือ catch block หรือไม่
try { <statements>; }
catch (<parameter>){ <statements>; }
finally{ <statements>; }
25
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. }
26

Error handle-OOP(รูปแบบและลักษณะการ Error ในโปรแกรม)