Dart:
Håndtering av feil

Hvordan:

Dart støtter to typer feil: kompileringstid-feil og kjøretid-feil. Kompileringstid-feil oppdages av Dart-analysatoren før koden kjører, mens kjøretid-feil, eller unntak, oppstår under utførelse. Slik håndterer du unntak i Dart:

Try-Catch

Bruk try-catch for å fange opp unntak og forhindre at de krasjer applikasjonen din:

try {
  var result = 100 ~/ 0; // Forsøker divisjon med null, kaster et unntak
} catch (e) {
  print('Fanget et unntak: $e'); // Håndterer unntaket
}

Eksempelutskrift: Fanget et unntak: IntegerDivisionByZeroException

Spesifikt Unntak

For å håndtere spesifikke unntak, nevn unntaket etter catch:

try {
  var result = 100 ~/ 0;
} on IntegerDivisionByZeroException {
  print('Kan ikke dele på null.'); // Håndterer spesifikt deling med null-unntak
}

Eksempelutskrift: Kan ikke dele på null.

Stakksporing

For å få en stakksporing for feilsøking, bruk en andre parameter i catch-blokken:

try {
  var result = 100 ~/ 0;
} catch (e, s) {
  print('Unntak: $e');
  print('Stakksporing: $s'); // Skriver ut stakksporing for feilsøking
}

Til slutt

Bruk finally for å utføre kode etter try/catch, uavhengig av om et unntak ble kastet:

try {
  var result = 100 ~/ 0;
} catch (e) {
  print('Fanget et unntak: $e');
} finally {
  print('Dette blir alltid utført.'); // Oppryddingskode eller siste steg
}

Eksempelutskrift:

Fanget et unntak: IntegerDivisionByZeroException
Dette blir alltid utført.

Tredjepartsbiblioteker

Selv om Darts kjernelibrary er robust for feilhåndtering, kan du også bruke tredjepartspakker som dartz for funksjonell programmering som innfører konsepter som Either og Option som kan brukes for feilhåndtering. Her er et eksempel på bruk av dartz for feilhåndtering:

  1. Legg dartz til din pubspec.yaml-fil under avhengigheter:
dependencies:
  dartz: ^0.10.0
  1. Bruk Either for å håndtere feil på en nådig måte i Dart-koden din:
import 'package:dartz/dartz.dart';

Either<String, int> divide(int dividend, int divisor) {
  if (divisor == 0) {
    return Left('Kan ikke dele på null.');
  } else {
    return Right(dividend ~/ divisor);
  }
}

void main() {
  final result = divide(100, 0);
  result.fold(
    (left) => print('Feil: $left'), 
    (right) => print('Resultat: $right')
  );
}

Eksempelutskrift: Feil: Kan ikke dele på null.

Left-delen representerer vanligvis feilen, og Right-delen representerer suksess. Dette mønsteret tillater håndtering av feil på en mer funksjonell måte, og tilbyr klarhet og kontroll over feilhåndtering.