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