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 luion 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 (caTypeError). Prinde doarIOExceptionsau 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.