Ce face Error
Un Error semnalează o greșeală în cod, pe care programatorul trebuie să o repare: un index în afara listei (RangeError), un argument greșit (ArgumentError), un obiect în stare greșită (StateError), o conversie de tip imposibilă (TypeError). Spre deosebire de Exception, erorile de obicei nu se prind: lași programul să se oprească și repari cauza.
Când un obiect Error este aruncat prima dată, Dart îi completează câmpul stackTrace cu lista apelurilor care au dus acolo (StackTrace). Înainte de aruncare, stackTrace este null.
Poți crea clase proprii care extind Error, pentru greșeli de folosire a codului tău (de exemplu o configurare imposibilă). Prinderea erorilor are sens doar la marginea programului, ca să le scrii într-un jurnal înainte de oprire.
Ce returnează
stackTrace: un StackTrace?.
Exemple
Exemplul 1: Erori din biblioteca standard
Le prindem doar ca să vedem ce tip au; într-un program real repari codul care le produce.
void main() {
var note = [9, 7, 10];
var incercari = <void Function()>[
() => note[5],
() => <int>[].first,
() => int.parse('7', radix: 50),
() => List<int>.unmodifiable(note).add(8),
];
for (var f in incercari) {
try {
f();
} on Error catch (e) {
print(e.runtimeType);
}
}
}
Rezultat
RangeError
StateError
RangeError
UnsupportedError
Exemplul 2: stackTrace este completat la aruncare
Nu afișăm tot stack trace-ul (conține căi de pe disc), doar verificăm ce funcții apar în el.
class ConfigurareGresita extends Error {
final String mesaj;
ConfigurareGresita(this.mesaj);
@override
String toString() => 'ConfigurareGresita: $mesaj';
}
void verificaPort(int port) {
if (port <= 0 || port > 65535) throw ConfigurareGresita('portul $port nu există');
}
void main() {
var eroare = ConfigurareGresita('test');
print(eroare.stackTrace == null);
try {
verificaPort(70000);
} on ConfigurareGresita catch (e) {
print(e);
print(e.stackTrace != null);
print(e.stackTrace.toString().contains('verificaPort'));
}
}
Rezultat
true
ConfigurareGresita: portul 70000 nu există
true
true
Greșeli frecvente
- Prinzi
Errorca să „treci peste” un index greșit. Problema rămâne în cod; repară cauza (verifică lungimea, foloseșteelementAtOrNull). - Faci excepțiile tale să extindă
Error. Pentru situații așteptate (date greșite, rețea) implementeazăException.
Comenzi înrudite
Exception: Interfața pentru probleme așteptate, pe care programul le poate trata: date greșite, fișier lipsă, rețea căzută.StackTrace: Lista apelurilor de funcții active într-un moment (cine pe cine a apelat), folosită pentru a găsi locul unei erori.Error.throwWithStackTrace: Aruncă un obiect împreună cu un StackTrace dat, de exemplu cel al erorii originale, ca să nu se piardă locul inițial.try, catch și finally: try prinde excepțiile din bloc; on alege tipul, catch dă acces la obiect, finally rulează mereu.