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ă
assertprotejează 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.