assert în Dart

Verifică o condiție în timpul dezvoltării; în producție și la dart run implicit, assert este ignorat.

Sintaxă
assert(conditie);
assert(conditie, 'mesaj');

Ce face assert

assert(conditie, 'mesaj') aruncă un AssertionError dacă condiția este falsă. Este o unealtă de depanare: verifici presupuneri care ar trebui să fie mereu adevărate (o listă nu este goală, un procent este între 0 și 100).

Important: aserțiunile sunt active doar în modul de dezvoltare. dart run le ignoră dacă nu adaugi --enable-asserts; dart test și Flutter în modul debug le activează. În programele compilate (dart compile exe) nu există deloc. Așa că nu pune în assert cod care trebuie să ruleze și nu te baza pe el pentru validarea datelor utilizatorului.

În constructori, assert se poate pune în lista de inițializare: Procent(this.valoare) : assert(valoare >= 0 && valoare <= 100);.

Parametri

Parametru Descriere
conditie Expresie bool care ar trebui să fie adevărată.
mesaj Opțional. Textul pus în AssertionError când condiția este falsă.

Exemple

Exemplul 1: Ignorat la dart run fără opțiune

Exemplul rulează cu dart run main.dart, fără --enable-asserts, deci aserțiunea falsă pentru nota 4 nu oprește programul.

void main() {
  final note = [9, 10, 4];
  for (final n in note) {
    assert(n >= 5, 'nota $n este sub 5');
    print('nota $n acceptată');
  }
}

Rezultat

nota 9 acceptată
nota 10 acceptată
nota 4 acceptată

Exemplul 2: Același program cu –enable-asserts

Cu opțiunea activă, aserțiunea falsă aruncă AssertionError și programul se oprește (codul de ieșire 255).

$ dart run --enable-asserts main.dart

Rezultat în terminal

nota 9 acceptată
nota 10 acceptată
Unhandled exception:
'file:///home/ana/proiect/main.dart': Failed assertion: line 4 pos 12: 'n >= 5': nota 4 este sub 5
#0      _AssertionError._doThrowNew (dart:core-patch/errors_patch.dart:67:4)
#1      _AssertionError._throwNew (dart:core-patch/errors_patch.dart:49:5)
#2      main (file:///home/ana/proiect/main.dart:4:12)

Exemplul 3: assert în constructor și validare reală

assert verifică doar în dezvoltare; pentru date venite de la utilizator, verificarea reală se face cu if și throw.

class Procent {
  final int valoare;
  Procent(this.valoare) : assert(valoare >= 0 && valoare <= 100);
}

Procent citesteProcent(int valoare) {
  if (valoare < 0 || valoare > 100) {
    throw ArgumentError.value(valoare, 'valoare', 'trebuie să fie între 0 și 100');
  }
  return Procent(valoare);
}

void main() {
  print(citesteProcent(19).valoare);
  try {
    citesteProcent(150);
  } on ArgumentError catch (e) {
    print(e);
  }
}

Rezultat

19
Invalid argument (valoare): trebuie să fie între 0 și 100: 150

Greșeli frecvente

  • Să crezi că assert protejează programul în producție: în codul compilat nu există.
  • Cod cu efecte în aserțiune (assert(lista.remove(x))): fără --enable-asserts, ștergerea nu mai are loc.
  • Să te miri că o aserțiune falsă nu face nimic la dart run: adaugă --enable-asserts.

Comenzi înrudite

  • throw: Aruncă o excepție sau o eroare care oprește execuția normală până o prinde un catch.
  • try, catch și finally: try prinde excepțiile din bloc; on alege tipul, catch dă acces la obiect, finally rulează mereu.
  • dart run: Rulează un program Dart: un fișier, programul principal al proiectului sau un executabil dintr-un pachet.