Dart Programming - ข้อยกเว้น

ข้อยกเว้น (หรือเหตุการณ์พิเศษ) คือปัญหาที่เกิดขึ้นระหว่างการทำงานของโปรแกรม เมื่อเกิดข้อยกเว้นโฟลว์ปกติของโปรแกรมจะหยุดชะงักและโปรแกรม / แอปพลิเคชันหยุดทำงานอย่างผิดปกติ

ข้อยกเว้นของ Dart ในตัว ได้แก่ -

ซีเนียร์ No ข้อยกเว้นและคำอธิบาย
1

DeferredLoadException

โยนเมื่อไม่สามารถโหลดไลบรารีรอการตัดบัญชี

2

FormatException

มีข้อยกเว้นเกิดขึ้นเมื่อสตริงหรือข้อมูลอื่นไม่มีรูปแบบที่คาดไว้และไม่สามารถแยกวิเคราะห์หรือประมวลผลได้

3

IntegerDivisionByZeroException

โยนเมื่อตัวเลขหารด้วยศูนย์

4

IOException

คลาสพื้นฐานสำหรับข้อยกเว้นที่เกี่ยวข้องกับ Inupt-Output ทั้งหมด

5

IsolateSpawnException

โยนทิ้งเมื่อไม่สามารถสร้างไอโซเลทได้

6

Timeout

โยนเมื่อหมดเวลาที่กำหนดไว้เกิดขึ้นในขณะที่รอผล async

ทุกข้อยกเว้นใน Dart เป็นประเภทย่อยของคลาสที่กำหนดไว้ล่วงหน้า Exception. ต้องมีการจัดการข้อยกเว้นเพื่อป้องกันไม่ให้แอปพลิเคชันยุติทันที

บล็อกลอง / เปิด / จับ

tryบล็อกฝังโค้ดที่อาจส่งผลให้เกิดข้อยกเว้น on block ถูกใช้เมื่อจำเป็นต้องระบุประเภทข้อยกเว้น catch บล็อกถูกใช้เมื่อตัวจัดการต้องการอ็อบเจ็กต์ข้อยกเว้น

try บล็อกต้องตามด้วยอย่างใดอย่างหนึ่ง on / catch บล็อกหรืออย่างใดอย่างหนึ่ง finallyบล็อก (หรือหนึ่งในทั้งสองอย่าง) เมื่อมีข้อยกเว้นเกิดขึ้นในบล็อก try ตัวควบคุมจะถูกโอนไปยังไฟล์catch.

syntax สำหรับการจัดการข้อยกเว้นเป็นไปตามที่ระบุด้านล่าง -

try { 
   // code that might throw an exception 
}  
on Exception1 { 
   // code for handling exception 
}  
catch Exception2 { 
   // code for handling exception 
}

ต่อไปนี้เป็นประเด็นที่ควรจำ -

  • ข้อมูลโค้ดสามารถมีบล็อกบน / จับได้มากกว่าหนึ่งบล็อกเพื่อจัดการกับข้อยกเว้นต่างๆ

  • บล็อกบนบล็อกและบล็อกจับนั้นรวมเข้าด้วยกันกล่าวคือบล็อกลองสามารถเชื่อมโยงกับทั้งบนบล็อกและบล็อกจับ

รหัสต่อไปนี้แสดงให้เห็นถึงการจัดการข้อยกเว้นใน Dart -

ตัวอย่าง: การใช้ ON Block

โปรแกรมต่อไปนี้หารสองตัวเลขที่แสดงโดยตัวแปร x และ yตามลำดับ รหัสจะแสดงข้อยกเว้นเนื่องจากพยายามหารด้วยศูนย์ on block มีรหัสสำหรับจัดการข้อยกเว้นนี้

main() { 
   int x = 12; 
   int y = 0; 
   int res;  
   
   try {
      res = x ~/ y; 
   } 
   on IntegerDivisionByZeroException { 
      print('Cannot divide by zero'); 
   } 
}

ควรผลิตสิ่งต่อไปนี้ output -

Cannot divide by zero

ตัวอย่าง: การใช้ Catch Block

ในตัวอย่างต่อไปนี้เราได้ใช้รหัสเดียวกันกับด้านบน ข้อแตกต่างเพียงอย่างเดียวคือcatch block(แทนบล็อก ON) ที่นี่มีรหัสสำหรับจัดการข้อยกเว้น พารามิเตอร์ของcatch มีอ็อบเจ็กต์ข้อยกเว้นที่ถูกโยนขณะรันไทม์

main() { 
   int x = 12; 
   int y = 0; 
   int res;  
   
   try {  
      res = x ~/ y; 
   }  
   catch(e) { 
      print(e); 
   } 
}

ควรผลิตสิ่งต่อไปนี้ output -

IntegerDivisionByZeroException

ตัวอย่าง: เมื่อ…จับ

ตัวอย่างต่อไปนี้แสดงวิธีการใช้ on...catch บล็อก.

main() { 
   int x = 12; 
   int y = 0; 
   int res;  
   
   try { 
      res = x ~/ y; 
   }  
   on IntegerDivisionByZeroException catch(e) { 
      print(e); 
   } 
}

ควรผลิตสิ่งต่อไปนี้ output -

IntegerDivisionByZeroException

สุดท้ายบล็อก

finallyบล็อกมีโค้ดที่ควรดำเนินการโดยไม่คำนึงถึงการเกิดข้อยกเว้น ไม่จำเป็นfinally บล็อกดำเนินการโดยไม่มีเงื่อนไขหลังจากนั้น try/on/catch.

ไวยากรณ์สำหรับการใช้ finally บล็อกมีดังนี้ -

try { 
   // code that might throw an exception 
}  
on Exception1 { 
   // exception handling code 
}  
catch Exception2 { 
   //  exception handling 
}  
finally { 
   // code that should always execute; irrespective of the exception 
}

ตัวอย่างต่อไปนี้แสดงให้เห็นถึงการใช้ finally บล็อก.

main() { 
   int x = 12; 
   int y = 0; 
   int res;  
   
   try { 
      res = x ~/ y; 
   } 
   on IntegerDivisionByZeroException { 
      print('Cannot divide by zero'); 
   } 
   finally { 
      print('Finally block executed'); 
   } 
}

ควรผลิตสิ่งต่อไปนี้ output -

Cannot divide by zero 
Finally block executed

โยนข้อยกเว้น

throwคำหลักถูกใช้เพื่อเพิ่มข้อยกเว้นอย่างชัดเจน ควรจัดการข้อยกเว้นที่เพิ่มขึ้นเพื่อป้องกันไม่ให้โปรแกรมออกจากระบบกะทันหัน

syntax สำหรับการเพิ่มข้อยกเว้นอย่างชัดเจนคือ -

throw new Exception_name()

ตัวอย่าง

ตัวอย่างต่อไปนี้แสดงวิธีการใช้ throw คำหลักที่จะโยนข้อยกเว้น -

main() { 
   try { 
      test_age(-2); 
   } 
   catch(e) { 
      print('Age cannot be negative'); 
   } 
}  
void test_age(int age) { 
   if(age<0) { 
      throw new FormatException(); 
   } 
}

ควรผลิตสิ่งต่อไปนี้ output -

Age cannot be negative

ข้อยกเว้นที่กำหนดเอง

ตามที่ระบุไว้ข้างต้นข้อยกเว้นทุกประเภทใน Dart เป็นประเภทย่อยของคลาสในตัว Exception. Dart เปิดใช้งานการสร้างข้อยกเว้นที่กำหนดเองโดยการขยายข้อยกเว้นที่มีอยู่ ไวยากรณ์สำหรับการกำหนดข้อยกเว้นที่กำหนดเองมีดังต่อไปนี้ -

ไวยากรณ์: การกำหนดข้อยกเว้น

class Custom_exception_Name implements Exception { 
   // can contain constructors, variables and methods 
}

ข้อยกเว้นที่กำหนดเองควรได้รับการยกขึ้นอย่างชัดเจนและควรจัดการเช่นเดียวกันในโค้ด

ตัวอย่าง

ตัวอย่างต่อไปนี้แสดงวิธีกำหนดและจัดการข้อยกเว้นแบบกำหนดเอง

class AmtException implements Exception { 
   String errMsg() => 'Amount should be greater than zero'; 
}  
void main() { 
   try { 
      withdraw_amt(-1); 
   } 
   catch(e) { 
      print(e.errMsg()); 
   }  
   finally { 
      print('Ending requested operation.....'); 
   } 
}  
void withdraw_amt(int amt) { 
   if (amt <= 0) { 
      throw new AmtException(); 
   } 
}

ในโค้ดด้านบนเรากำลังกำหนดข้อยกเว้นที่กำหนดเอง AmtException. รหัสจะเพิ่มข้อยกเว้นหากจำนวนเงินที่ส่งผ่านไม่อยู่ในช่วงที่ยกเว้น main ฟังก์ชันล้อมรอบการเรียกใช้ฟังก์ชันในไฟล์ try...catch บล็อก.

รหัสควรสร้างสิ่งต่อไปนี้ output -

Amount should be greater than zero 
Ending requested operation....