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