FormatException în Dart

Excepția aruncată când un text nu are formatul așteptat (int.parse('abc'), JSON greșit, dată invalidă).

Sintaxă
const FormatException([String message = '', dynamic source, int? offset])
final String message
final dynamic source
final int? offset

Ce face FormatException

FormatException apare când transformi un text care nu are forma cerută: int.parse('12a'), double.parse, DateTime.parse, Uri.parse, jsonDecode. Este o Exception, deci se prinde și se tratează: afișezi un mesaj și ceri din nou datele.

Are trei câmpuri: message (descrierea problemei), source (textul care a fost citit, dacă se cunoaște) și offset (poziția din text unde a apărut problema, sau null). toString() le combină și, când are poziția, arată și locul greșelii.

O poți arunca și tu, în funcțiile care citesc formate proprii: throw FormatException('CNP invalid', text, 3). Pentru citiri în care textul greșit este normal, metodele tryParse returnează null și evită excepția.

Parametri

Parametru Descriere
message Descrierea problemei.
source Textul (sau datele) citite.
offset Poziția problemei în source.

Ce returnează

Un obiect FormatException.

Exemple

Exemplul 1: Câmpurile unei FormatException

int.parse raportează poziția 0 (tot textul este greșit), iar jsonDecode arată poziția exactă a caracterului neașteptat.

import 'dart:convert';

void main() {
  try {
    int.parse('12a');
  } on FormatException catch (e) {
    print('mesaj: ${e.message}');
    print('sursă: ${e.source}');
    print('poziție: ${e.offset}');
  }
  try {
    jsonDecode('{"nume": "Ana", }');
  } on FormatException catch (e) {
    print('JSON greșit: ${e.message} la poziția ${e.offset}');
  }
}

Rezultat

mesaj: Invalid radix-10 number
sursă: 12a
poziție: 0
JSON greșit: Unexpected character la poziția 16

Exemplul 2: Aruncarea unei FormatException proprii

Funcția verifică un cod poștal românesc. toString() afișează și textul sursă, iar când știe poziția pune un ^ sub caracterul greșit.

int codPostal(String text) {
  if (text.length != 6) {
    throw FormatException('Codul poștal are 6 cifre, nu ${text.length}', text);
  }
  for (var i = 0; i < text.length; i++) {
    var c = text.codeUnitAt(i);
    if (c < 48 || c > 57) throw FormatException('Caracter nepermis', text, i);
  }
  return int.parse(text);
}

void main() {
  for (var t in ['700506', '7005', '70O506']) {
    try {
      print('Cod valid: ${codPostal(t)}');
    } on FormatException catch (e) {
      print(e);
    }
  }
}

Rezultat

Cod valid: 700506
FormatException: Codul poștal are 6 cifre, nu 4
7005
FormatException: Caracter nepermis (at character 3)
70O506
  ^

Greșeli frecvente

  • Prinzi FormatException într-o buclă de citire doar ca să ceri din nou valoarea. int.tryParse este mai simplu și mai rapid.
  • Afișezi utilizatorului direct e.toString(), care este în engleză și tehnic. Afișează un mesaj propriu și păstrează detaliile pentru jurnal.

Comenzi înrudite

  • Exception: Interfața pentru probleme așteptate, pe care programul le poate trata: date greșite, fișier lipsă, rețea căzută.
  • int.parse: Transformă un text în număr întreg; parse aruncă FormatException la text greșit, tryParse returnează null.
  • double.parse: Transformă un text în număr cu zecimale; parse aruncă FormatException, tryParse returnează null.
  • DateTime.parse: Transformă un text în format ISO 8601 (2026-10-19 14:30) într-un DateTime; tryParse dă null la text greșit.
  • jsonDecode: Citește un text JSON și îl transformă în Map, List, String, num, bool sau null; dă FormatException la text greșit.