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 cuon Exception. Aruncă un obiectException.
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.