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
dartz
i dinpubspec.yaml
-fil under beroenden:
dependencies:
dartz: ^0.10.0
- Använd
Either
fö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.