Dart:
การจัดการกับข้อผิดพลาด
วิธีการ:
Dart รองรับข้อผิดพลาดสองประเภท: ข้อผิดพลาดในช่วงเวลาคอมไพล์ และข้อผิดพลาดในช่วงเวลารันไทม์ ข้อผิดพลาดช่วงเวลาคอมไพล์จะถูกตรวจจับโดย Dart analyzer ก่อนที่โค้ดจะทำงาน ในขณะที่ข้อผิดพลาดช่วงเวลารันไทม์ หรือข้อยกเว้น เกิดขึ้นระหว่างการทำงาน นี่คือวิธีที่คุณจัดการกับข้อยกเว้นใน Dart:
Try-Catch
ใช้ try-catch
เพื่อจับข้อยกเว้นและป้องกันไม่ให้มันทำให้แอปพลิเคชันของคุณขัดข้อง:
try {
var result = 100 ~/ 0; // พยายามทำการหารด้วยศูนย์ แล้วทำให้เกิดข้อยกเว้น
} catch (e) {
print('Caught an exception: $e'); // จัดการกับข้อยกเว้น
}
ตัวอย่างผลลัพธ์: Caught an exception: IntegerDivisionByZeroException
ข้อยกเว้นเฉพาะ
เพื่อจัดการข้อยกเว้นเฉพาะ ให้ระบุข้อยกเว้นหลังจาก catch
:
try {
var result = 100 ~/ 0;
} on IntegerDivisionByZeroException {
print('Cannot divide by zero.'); // จัดการเฉพาะการหารด้วยศูนย์
}
ตัวอย่างผลลัพธ์: Cannot divide by zero.
ร่องรอยสแต็ค
เพื่อดูร่องรอยสแต็คสำหรับการดีบัก ใช้พารามิเตอร์ที่สองในบล็อก catch:
try {
var result = 100 ~/ 0;
} catch (e, s) {
print('Exception: $e');
print('Stack trace: $s'); // พิมพ์ร่องรอยสแต็คสำหรับการดีบัก
}
Finally
ใช้ finally
เพื่อเรียกใช้โค้ดหลังจาก try/catch ไม่ว่าข้อยกเว้นจะถูกโยนหรือไม่:
try {
var result = 100 ~/ 0;
} catch (e) {
print('Caught an exception: $e');
} finally {
print('This is always executed.'); // โค้ดทำความสะอาดหรือขั้นตอนสุดท้าย
}
ตัวอย่างผลลัพธ์:
Caught an exception: IntegerDivisionByZeroException
This is always executed.
ไลบรารีของบุคคลที่สาม
แม้ว่าไลบรารีหลักของ Dart จะแข็งแกร่งสำหรับการจัดการข้อผิดพลาด คุณยังสามารถใช้แพ็กเกจของบุคคลที่สามเช่น dartz
สำหรับการเขียนโปรแกรมแบบฟังก์ชัน ซึ่งนำเสนอแนวคิดเช่น Either
และ Option
ที่สามารถใช้สำหรับการจัดการข้อผิดพลาด นี่คือตัวอย่างการใช้ dartz
สำหรับการจัดการข้อผิดพลาด:
- เพิ่ม
dartz
ไปยังไฟล์pubspec.yaml
ของคุณภายใต้ dependencies:
dependencies:
dartz: ^0.10.0
- ใช้
Either
สำหรับการจัดการข้อผิดพลาดอย่างประณีประนอมในโค้ด Dart ของคุณ:
import 'package:dartz/dartz.dart';
Either<String, int> divide(int dividend, int divisor) {
if (divisor == 0) {
return Left('Cannot divide by zero.');
} else {
return Right(dividend ~/ divisor);
}
}
void main() {
final result = divide(100, 0);
result.fold(
(left) => print('Error: $left'),
(right) => print('Result: $right')
);
}
ตัวอย่างผลลัพธ์: Error: Cannot divide by zero.
ส่วน Left
โดยปกติแสดงถึงข้อผิดพลาด และส่วน Right
แสดงถึงความสำเร็จ รูปแบบนี้ช่วยให้สามารถจัดการกับข้อผิดพลาดได้อย่างมีฟังก์ชันมากขึ้น มอบความชัดเจนและความควบคุมเหนือการจัดการข้อผิดพลาด