exit în Dart

Oprește imediat programul cu codul de ieșire dat: 0 pentru succes, altă valoare pentru eroare.

Sintaxă
Never exit(int code)
int exitCode   // variabilă globală, get și set

Ce face exit

exit(cod) din dart:io termină programul pe loc. Codul de ieșire ajunge la cine a pornit programul (terminalul, un script, CI-ul): 0 înseamnă succes, iar 1–255 înseamnă diferite erori. În terminal îl vezi cu echo $?.

Tipul returnat este Never: după exit nu se mai execută nimic, iar analizorul știe asta (de exemplu, o variabilă nullable verificată înainte de exit devine sigură după). Operațiile asincrone neterminate, inclusiv scrieri în fișiere, se pierd; apelează await stdout.flush() și închide fișierele înainte.

O variantă mai blândă este variabila globală exitCode: o setezi (exitCode = 1;) și programul se termină normal, cu acel cod, după ce toate operațiile asincrone s-au încheiat.

Parametri

Parametru Descriere
code Codul de ieșire: 0 pentru succes, 1–255 pentru erori.

Exemple

Exemplul 1: Oprire după afișarea ajutorului

Programul nu primește argumente, deci afișează ajutorul și se oprește cu codul 0; ultimul print nu se mai execută.

import 'dart:io';

void main(List<String> args) {
  if (args.isEmpty) {
    print('Utilizare: dart run main.dart <fișier-note>');
    print('Calculează media notelor din fișier.');
    exit(0);
  }
  print('Prelucrez ${args.first}...');
}

Rezultat

Utilizare: dart run main.dart <fișier-note>
Calculează media notelor din fișier.

Exemplul 2: Eroare semnalată cu un cod diferit de 0

Rulat în terminal; echo $? afișează codul cu care s-a terminat programul.

import 'dart:io';

void main() {
  final fisier = File('note.csv');
  if (!fisier.existsSync()) {
    stderr.writeln('Eroare: lipsește fișierul ${fisier.path}');
    exit(2);
  }
  print(fisier.readAsStringSync());
}

Rezultat în terminal (dart run main.dart; echo $?)

Eroare: lipsește fișierul note.csv
2

Exemplul 3: exit după ce datele au fost scrise

Fișierul este închis cu await înainte de exit, deci raportul este complet.

import 'dart:io';

Future<void> main() async {
  final raport = File('raport.txt').openWrite();
  raport.writeln('Vânzări Iași: 1200 lei');
  raport.writeln('Vânzări Cluj: 950 lei');
  await raport.close();
  print('Raport salvat: ${File('raport.txt').readAsLinesSync().length} rânduri.');
  await stdout.flush();
  exit(0);
}

Rezultat

Raport salvat: 2 rânduri.

Greșeli frecvente

  • Apelezi exit imediat după writeAsString fără await: fișierul poate rămâne gol sau neterminat.
  • Folosești exit într-o aplicație Flutter: aplicația dispare brusc, iar pe iOS asta încalcă regulile App Store. În consolă și pe server este în regulă.
  • Folosești coduri mai mari de 255: pe macOS și Linux se păstrează doar ultimii 8 biți, deci exit(256) apare ca 0.

Comenzi înrudite

  • stderr: stderr este ieșirea de erori a programului, separată de stdout; aici scrii avertismentele și mesajele de eroare.
  • stdout: stdout este ieșirea standard a programului: tot ce apare în terminal; are metodele unui IOSink (write, writeln, writeAll).
  • ProcessResult: Rezultatul lui Process.run: codul de ieșire și tot ce a scris programul în stdout și în stderr.
  • sleep: Oprește complet execuția programului (isolate-ul curent) pentru durata dată; nimic altceva nu rulează între timp.