Exception în Dart

Interfața pentru probleme așteptate, pe care programul le poate trata: date greșite, fișier lipsă, rețea căzută.

Sintaxă
abstract interface class Exception
factory Exception([var message])

Ce face Exception

Dart face diferența între două feluri de probleme. O excepție (Exception) este o situație previzibilă, care nu ține de o greșeală în cod: utilizatorul a scris un text care nu este număr, un fișier lipsește, serverul nu răspunde. Programul ar trebui să o prindă cu try/catch și să continue. O eroare (Error) înseamnă o greșeală de programare și de obicei nu se prinde.

Constructorul Exception('mesaj') creează o excepție simplă, care se afișează ca Exception: mesaj. În practică este mai bine să-ți faci propriile clase care implementează Exception (de exemplu SoldInsuficientException), ca cine le prinde să le poată deosebi cu on.

Biblioteca standard are excepții gata făcute: FormatException, IOException, TimeoutException. Poți arunca orice obiect cu throw, dar convenția este să arunci doar obiecte Exception sau Error.

Parametri

Parametru Descriere
message Mesajul excepției (opțional).

Ce returnează

Un obiect care implementează Exception.

Exemple

Exemplul 1: O excepție simplă

double imparte(double a, double b) {
  if (b == 0) throw Exception('Nu pot împărți la zero');
  return a / b;
}

void main() {
  try {
    print(imparte(10, 4));
    print(imparte(10, 0));
  } on Exception catch (e) {
    print('Problemă: $e');
  }
  print('Programul continuă');
}

Rezultat

2.5
Problemă: Exception: Nu pot împărți la zero
Programul continuă

Exemplul 2: O excepție proprie

Clasa proprie poartă date utile (soldul, suma cerută), iar on SoldInsuficient o prinde doar pe ea.

class SoldInsuficient implements Exception {
  final double sold;
  final double ceruta;
  SoldInsuficient(this.sold, this.ceruta);

  @override
  String toString() => 'SoldInsuficient: ai $sold lei, ai cerut $ceruta lei';
}

class Cont {
  double sold;
  Cont(this.sold);

  void retrage(double suma) {
    if (suma > sold) throw SoldInsuficient(sold, suma);
    sold -= suma;
  }
}

void main() {
  var cont = Cont(250);
  for (var suma in [100.0, 200.0, 50.0]) {
    try {
      cont.retrage(suma);
      print('Ai retras $suma lei, rămân ${cont.sold}');
    } on SoldInsuficient catch (e) {
      print(e);
      print('Îți lipsesc ${e.ceruta - e.sold} lei');
    }
  }
}

Rezultat

Ai retras 100.0 lei, rămân 150.0
SoldInsuficient: ai 150.0 lei, ai cerut 200.0 lei
Îți lipsesc 50.0 lei
Ai retras 50.0 lei, rămân 100.0

Greșeli frecvente

  • Prinzi totul cu catch (e) fără on. Prinzi și erorile de programare (Error), care ar trebui reparate, nu ascunse.
  • Arunci texte: throw 'Sold insuficient';. Funcționează, dar nu poate fi prins cu on Exception. Aruncă un obiect Exception.

Comenzi înrudite

  • Error: Clasa de bază pentru greșelile de programare (index greșit, argument invalid); stackTrace arată unde a fost aruncată.
  • FormatException: Excepția aruncată când un text nu are formatul așteptat (int.parse(‘abc’), JSON greșit, dată invalidă).
  • try, catch și finally: try prinde excepțiile din bloc; on alege tipul, catch dă acces la obiect, finally rulează mereu.
  • throw: Aruncă o excepție sau o eroare care oprește execuția normală până o prinde un catch.