stderr în Dart

stderr este ieșirea de erori a programului, separată de stdout; aici scrii avertismentele și mesajele de eroare.

Sintaxă
import 'dart:io';

Stdout get stderr
stderr.writeln('mesaj de eroare');

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 în stdout, 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.