Error în Dart

Clasa de bază pentru greșelile de programare (index greșit, argument invalid); stackTrace arată unde a fost aruncată.

Sintaxă
class Error
StackTrace? get stackTrace

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 Error ca să „treci peste” un index greșit. Problema rămâne în cod; repară cauza (verifică lungimea, folosește elementAtOrNull).
  • 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.