FileSystemException în Dart

Excepția aruncată de operațiile cu fișiere (lipsă, fără drepturi, ocupat); IOException este clasa de bază a erorilor dart:io.

Sintaxă
class FileSystemException implements IOException
final String message
final String? path
final OSError? osError

abstract class IOException implements Exception

Ce face FileSystemException

Operațiile cu fișiere și directoare aruncă FileSystemException când ceva nu merge. Are trei câmpuri: message (ce operație a eșuat, de exemplu Cannot open file), path (calea) și osError (eroarea sistemului de operare, cu message și errorCode).

Există subclase pentru cazurile frecvente: PathNotFoundException (calea nu există), PathAccessException (fără drepturi) și PathExistsException (există deja). Le prinzi separat cu on PathNotFoundException, înaintea cazului general.

IOException este clasa de bază pentru toate erorile de intrare/ieșire din dart:io: FileSystemException, SocketException, HttpException, ProcessException, StdinException. Cu on IOException prinzi orice eroare de acest fel.

Exemple

Exemplul 1: Câmpurile excepției

import 'dart:io';

void main() {
  try {
    File('nu_exista.txt').readAsStringSync();
  } on FileSystemException catch (eroare) {
    print(eroare.runtimeType);
    print('message: ${eroare.message}');
    print('path: ${eroare.path}');
    print('osError: ${eroare.osError?.message} (cod ${eroare.osError?.errorCode})');
  }
}

Rezultat

PathNotFoundException
message: Cannot open file
path: nu_exista.txt
osError: No such file or directory (cod 2)

Exemplul 2: Cazuri diferite, tratate diferit

import 'dart:io';

String citeste(String cale) {
  try {
    return File(cale).readAsStringSync();
  } on PathNotFoundException {
    return '[$cale lipsește]';
  } on FileSystemException catch (eroare) {
    return '[$cale: ${eroare.message}]';
  }
}

void main() {
  File('bun.txt').writeAsStringSync('conținut');
  Directory('dosar').createSync();
  print(citeste('bun.txt'));
  print(citeste('rau.txt'));
  print(citeste('dosar'));
}

Rezultat

conținut
[rau.txt lipsește]
[dosar: Cannot open file]

Exemplul 3: IOException prinde orice eroare de intrare/ieșire

import 'dart:io';

Future<void> main() async {
  final operatii = <String, Future<void> Function()>{
    'citire': () => File('lipsa.txt').readAsString(),
    'ștergere': () => Directory('lipsa').delete(),
    'proces': () => Process.run('comanda_inexistenta_xyz', []),
  };
  for (final MapEntry(:key, :value) in operatii.entries) {
    try {
      await value();
    } on IOException catch (eroare) {
      print('$key: ${eroare.runtimeType}');
    }
  }
}

Rezultat

citire: PathNotFoundException
ștergere: PathNotFoundException
proces: ProcessException

Greșeli frecvente

  • Pui on FileSystemException înaintea lui on PathNotFoundException: primul bloc le prinde pe toate, iar al doilea nu se mai execută. Pune cazurile specifice primele.
  • Prinzi totul cu catch (e) și ascunzi erori de programare (ca TypeError). Prinde doar IOException sau subclasele ei.

Comenzi înrudite

  • File.readAsString: Citește tot conținutul unui fișier text într-un String (implicit UTF-8); varianta Sync blochează până termină.
  • File.delete: Șterge fișierul de pe disc (definitiv, nu în coș); aruncă eroare dacă fișierul nu există.
  • Process.run: Pornește alt program, așteaptă să se termine și returnează ce a scris (stdout, stderr) și codul de ieșire.