Error.throwWithStackTrace în Dart

Aruncă un obiect împreună cu un StackTrace dat, de exemplu cel al erorii originale, ca să nu se piardă locul inițial.

Sintaxă
static Never throwWithStackTrace(Object error, StackTrace stackTrace)

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 simplu rethrow.

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.