Ce face stderr
Fiecare program are două ieșiri: stdout pentru rezultate și stderr pentru erori și avertismente. În terminal ambele apar pe ecran, dar pot fi redirecționate separat: dart run main.dart > date.txt 2> erori.log pune rezultatele într-un fișier și erorile în altul.
stderr are aceleași metode ca stdout (write, writeln, writeAll). Pentru a anunța și sistemului că programul a eșuat, setezi exitCode = 1 sau apelezi exit(1).
Pe această pagină, ieșirile sunt capturate separat: tot textul din stderr apare după cel din stdout. În terminal, mesajele apar amestecate, în ordinea în care au fost scrise.
Exemple
Exemplul 1: Rezultate în stdout, probleme în stderr
Rândurile greșite merg în stderr; de aceea apar la final în rezultatul de mai jos.
import 'dart:io';
void main() {
final randuri = ['Ana;9', 'Ion;zece', 'Maria;10', 'Radu'];
for (final rand in randuri) {
final parti = rand.split(';');
final nota = parti.length == 2 ? int.tryParse(parti[1]) : null;
if (nota == null) {
stderr.writeln('Avertisment: rând ignorat „$rand”');
continue;
}
stdout.writeln('${parti[0]}: $nota');
}
}
Rezultat
Ana: 9
Maria: 10
Avertisment: rând ignorat „Ion;zece”
Avertisment: rând ignorat „Radu”
Exemplul 2: Mesajul unei excepții, scris în stderr
Mesajul de eroare este scris primul, dar pe pagină apare la final, pentru că stderr este capturat separat de stdout.
import 'dart:io';
void main() {
try {
final continut = File('setari.json').readAsStringSync();
print(continut);
} on PathNotFoundException catch (eroare) {
stderr.writeln('Eroare: nu găsesc fișierul ${eroare.path}');
}
print('Programul continuă cu setările implicite.');
}
Rezultat
Programul continuă cu setările implicite.
Eroare: nu găsesc fișierul setari.json
Exemplul 3: Redirecționarea erorilor în terminal
Primul exemplu, rulat cu 2> erori.log: pe ecran rămân doar rezultatele, avertismentele ajung în fișier.
dart run main.dart 2> erori.log
cat erori.log
Rezultat în terminal
Ana: 9
Maria: 10
Avertisment: rând ignorat „Ion;zece”
Avertisment: rând ignorat „Radu”
Greșeli frecvente
- Scrii erorile cu
print: ajung înstdout, iar cine redirecționează rezultatele într-un fișier primește și erorile în date. - Scrii mesajul de eroare, dar programul se termină cu codul 0: scripturile care îl apelează cred că a reușit. Setează
exitCode = 1.
Comenzi înrudite
stdout: stdout este ieșirea standard a programului: tot ce apare în terminal; are metodele unui IOSink (write, writeln, writeAll).exit: Oprește imediat programul cu codul de ieșire dat: 0 pentru succes, altă valoare pentru eroare.FileSystemException: Excepția aruncată de operațiile cu fișiere (lipsă, fără drepturi, ocupat); IOException este clasa de bază a erorilor dart:io.ProcessResult: Rezultatul lui Process.run: codul de ieșire și tot ce a scris programul în stdout și în stderr.