Dart:
Hantering av fel
Hur gör man:
Dart stöder två typer av fel: kompileringstidsfel och körtidsfel. Kompileringstidsfel upptäcks av Dart-analysatorn innan koden körs, medan körtidsfel, eller undantag, inträffar under körning. Så här hanterar du undantag i Dart:
Try-Catch
Använd try-catch för att fånga undantag och förhindra att de kraschar din applikation:
try {
var result = 100 ~/ 0; // Försöker dela med noll, kastar ett undantag
} catch (e) {
print('Fångade ett undantag: $e'); // Hanterar undantaget
}Exempelutmatning: Fångade ett undantag: IntegerDivisionByZeroException
Specifikt Undantag
För att hantera specifika undantag, nämn undantaget efter catch:
try {
var result = 100 ~/ 0;
} on IntegerDivisionByZeroException {
print('Kan inte dela med noll.'); // Hanterar specifikt delningsfel genom noll
}Exempelutmatning: Kan inte dela med noll.
Stack Trace
För att få en stackspårning för felsökning, använd en andra parameter i catch-blocket:
try {
var result = 100 ~/ 0;
} catch (e, s) {
print('Undantag: $e');
print('Stackspårning: $s'); // Skriver ut stackspårning för felsökning
}Finally
Använd finally för att exekvera kod efter try/catch, oavsett om ett undantag kastades:
try {
var result = 100 ~/ 0;
} catch (e) {
print('Fångade ett undantag: $e');
} finally {
print('Detta utförs alltid.'); // Städkod eller slutsteg
}Exempelutmatning:
Fångade ett undantag: IntegerDivisionByZeroException
Detta utförs alltid.Tredjepartsbibliotek
Även om Darts kärnbibliotek är robust för felhantering, kan du också använda tredjepartspaket som dartz för funktionell programmering som introducerar begrepp som Either och Option som kan användas för felhantering. Här är ett exempel på hur du använder dartz för felhantering:
- Lägg till
dartzi dinpubspec.yaml-fil under beroenden:
dependencies:
dartz: ^0.10.0- Använd
Eitherför att hantera fel på ett smidigt sätt i din Dart-kod:
import 'package:dartz/dartz.dart';
Either<String, int> divide(int dividend, int divisor) {
if (divisor == 0) {
return Left('Kan inte dela med noll.');
} else {
return Right(dividend ~/ divisor);
}
}
void main() {
final result = divide(100, 0);
result.fold(
(left) => print('Fel: $left'),
(right) => print('Resultat: $right')
);
}Exempelutmatning: Fel: Kan inte dela med noll.
Den Left delen representerar vanligtvis felet, och den Right delen representerar framgång. Detta mönster möjliggör felhantering på ett mer funktionellt sätt, vilket erbjuder klarhet och kontroll över felhantering.