Ce face Error.throwWithStackTrace
Când prinzi o excepție și arunci alta în locul ei (de exemplu transformi o FormatException într-o excepție a aplicației tale), noua excepție primește un stack trace nou, care arată doar locul unde ai aruncat-o tu. Locul real al problemei se pierde.
Error.throwWithStackTrace(obiect, st) aruncă obiectul, dar cu stack trace-ul st, de obicei cel prins cu catch (e, st). Funcția returnează Never: compilatorul știe că după ea codul nu mai continuă. Dacă vrei să arunci aceeași excepție mai departe, folosește rethrow.
Parametri
| Parametru | Descriere |
|---|---|
error |
Obiectul aruncat (nu null). |
stackTrace |
Stack trace-ul asociat. |
Ce returnează
Nu returnează niciodată (Never).
Exemple
Exemplul 1: Păstrarea locului original
Excepția nouă, EroareConfig, păstrează stack trace-ul lui int.parse, deci în el apare funcția citestePort, unde a apărut problema.
class EroareConfig implements Exception {
final String mesaj;
EroareConfig(this.mesaj);
@override
String toString() => 'EroareConfig: $mesaj';
}
int citestePort(String valoare) => int.parse(valoare);
int incarcaConfig(Map<String, String> config) {
try {
return citestePort(config['port']!);
} on FormatException catch (e, st) {
Error.throwWithStackTrace(EroareConfig('portul „${e.source}” nu este număr'), st);
}
}
void main() {
try {
incarcaConfig({'port': 'optzeci'});
} on EroareConfig catch (e, st) {
print(e);
print(st.toString().contains('citestePort'));
}
}
Rezultat
EroareConfig: portul „optzeci” nu este număr
true
Exemplul 2: Fără throwWithStackTrace
Cu un throw obișnuit, stack trace-ul începe în incarca, iar funcția citeste nu mai apare.
int citeste(String v) => int.parse(v);
int incarca(String v) {
try {
return citeste(v);
} on FormatException {
throw StateError('configurare invalidă');
}
}
void main() {
try {
incarca('x');
} on StateError catch (e, st) {
print(e.message);
print(st.toString().contains('citeste '));
print(st.toString().contains('incarca'));
}
}
Rezultat
configurare invalidă
false
true
Greșeli frecvente
- Folosești
throwWithStackTrace(e, st)cu aceeași excepție pe care ai prins-o. Scrie simplurethrow.
Comenzi înrudite
StackTrace: Lista apelurilor de funcții active într-un moment (cine pe cine a apelat), folosită pentru a găsi locul unei erori.Error: Clasa de bază pentru greșelile de programare (index greșit, argument invalid); stackTrace arată unde a fost aruncată.rethrow: Aruncă mai departe excepția prinsă în catch, păstrând stiva de apeluri originală.try, catch și finally: try prinde excepțiile din bloc; on alege tipul, catch dă acces la obiect, finally rulează mereu.