StateError în Dart

Eroarea aruncată când o operație nu are sens în starea curentă a obiectului, de exemplu first pe o listă goală.

Sintaxă
StateError(String message)
final String message

Ce face StateError

StateError spune: „operația este corectă în general, dar nu acum”. Exemple din biblioteca standard: first, last, single sau reduce pe o colecție goală (No element), single pe o colecție cu mai multe elemente (Too many elements), ascultarea de două ori a unui Stream simplu.

Aruncă și tu StateError în clasele tale când o metodă este apelată la momentul greșit: retragere dintr-un cont închis, pornirea unui joc deja pornit. Mesajul este în câmpul message.

Pentru colecții există variante care nu aruncă: firstOrNull, lastOrNull, firstWhere(..., orElse: ...).

Parametri

Parametru Descriere
message Descrierea problemei.

Ce returnează

Un obiect StateError.

Exemple

Exemplul 1: StateError din colecții

void main() {
  var cos = <String>[];
  try {
    print(cos.first);
  } on StateError catch (e) {
    print('first: ${e.message}');
  }
  try {
    print(['Ana', 'Mihai'].single);
  } on StateError catch (e) {
    print('single: ${e.message}');
  }
  print(cos.firstOrNull);
}

Rezultat

first: No element
single: Too many elements
null

Exemplul 2: O clasă care își verifică starea

class Comanda {
  final produse = <String>[];
  bool trimisa = false;

  void adauga(String p) {
    if (trimisa) throw StateError('Comanda a fost deja trimisă');
    produse.add(p);
  }

  void trimite() {
    if (produse.isEmpty) throw StateError('Comanda este goală');
    trimisa = true;
  }
}

void main() {
  var c = Comanda();
  try {
    c.trimite();
  } on StateError catch (e) {
    print(e.message);
  }
  c.adauga('Pizza');
  c.trimite();
  try {
    c.adauga('Suc');
  } on StateError catch (e) {
    print(e);
  }
}

Rezultat

Comanda este goală
Bad state: Comanda a fost deja trimisă

Greșeli frecvente

  • Folosești lista.first fără să știi sigur că lista are elemente. Verifică isNotEmpty sau folosește firstOrNull.

Comenzi înrudite

  • Error: Clasa de bază pentru greșelile de programare (index greșit, argument invalid); stackTrace arată unde a fost aruncată.
  • ArgumentError: Eroarea aruncată când o funcție primește un argument nepermis; ArgumentError.value include și valoarea greșită.
  • Iterable.first: first și last dau primul și ultimul element; single dă singurul element și verifică faptul că este unul singur.
  • Iterable.firstOrNull: Primul, ultimul sau singurul element, ori null în loc de excepție când nu există.