Menu
Coddy logo textTech

Il blocco 'finally'

Fa parte della sezione Logica e flusso del percorso Dart di Coddy. Lezione 41 di 65.

A volte hai bisogno di codice che venga eseguito indipendentemente da ciò che accade nel blocco try-catch. Il blocco finally serve proprio a questo scopo: contiene codice che viene sempre eseguito, indipendentemente dal fatto che si verifichi o meno un’eccezione.

Il blocco finally viene dopo i blocchi try e catch. Anche se il tuo codice viene eseguito correttamente nella sezione try, o se un'eccezione viene intercettata e gestita, il blocco finally verrà comunque eseguito.

try {
  // Codice che potrebbe causare un'eccezione
  int result = 10 ~/ 2;
  print("Result: $result");
} catch (e) {
  print("An error occurred: $e");
} finally {
  print("This always runs!");
}

Questo rende il blocco finally perfetto per le operazioni di pulizia, come chiudere file, rilasciare risorse o registrare che un’operazione è stata completata. Qualunque cosa accada nella gestione degli errori, puoi garantire che determinate istruzioni vengano sempre eseguite.

challenge icon

Sfida

Facile

Crea un programma che dimostri il blocco finally implementando un simulatore di elaborazione di file che esegue sempre le operazioni di pulizia, indipendentemente dal fatto che si verifichi un errore durante l'elaborazione.

  1. Leggi una stringa in input che rappresenta il nome del file da elaborare
  2. Leggi una stringa in input che rappresenta il contenuto del file
  3. Leggi una stringa in input che rappresenta se simulare un errore ("error" oppure "success")
  4. Usa una struttura try-catch-finally per simulare l'elaborazione del file:
    • Nel blocco try: controlla se la simulazione dell'errore è "error" e, in tal caso, lancia un'eccezione con il messaggio "File processing failed"; altrimenti, elabora il file correttamente
    • Nel blocco catch: gestisci eventuali eccezioni che si verificano durante l'elaborazione
    • Nel blocco finally: esegui sempre le operazioni di pulizia, indipendentemente dal successo o dal fallimento
  5. Visualizza i risultati dell'elaborazione nel formato esatto mostrato di seguito

Per esempio, se gli input sono "document.txt", "Hello World", "success", il programma dovrebbe produrre:

File Processing System
======================
Opening file: document.txt
File content: Hello World
Processing file successfully...
File processed: 11 characters found
Cleanup: Closing file handles
Cleanup: Releasing memory resources
Cleanup: Logging operation completion
Processing completed successfully

Se gli input sono "report.pdf", "Annual Report Data", "error", il programma dovrebbe produrre:

File Processing System
======================
Opening file: report.pdf
File content: Annual Report Data
Error occurred: File processing failed
Unable to complete file processing
Cleanup: Closing file handles
Cleanup: Releasing memory resources
Cleanup: Logging operation completion
Processing completed with errors

Se gli input sono "config.json", "{\"setting\": \"value\"}", "success", il programma dovrebbe produrre:

File Processing System
======================
Opening file: config.json
File content: {"setting": "value"}
Processing file successfully...
File processed: 20 characters found
Cleanup: Closing file handles
Cleanup: Releasing memory resources
Cleanup: Logging operation completion
Processing completed successfully

Il programma deve usare una struttura try-catch-finally in cui il blocco finally esegue sempre le tre operazioni di pulizia nell'ordine esatto mostrato. Nel blocco try, controlla se l'input della simulazione dell'errore è uguale a "error" e, in tal caso, lancia un'eccezione. Se non viene simulato alcun errore, conta i caratteri del contenuto del file usando la proprietà length. Il blocco finally deve sempre stampare i messaggi di pulizia e determinare lo stato finale del completamento in base al fatto che si sia verificato un errore.

Provalo tu

import 'dart:io';

void main() {
  // Leggi l'input
  String? filename = stdin.readLineSync();
  String? content = stdin.readLineSync();
  String? errorSimulation = stdin.readLineSync();
  
  // Visualizza l'intestazione del sistema
  print("File Processing System");
  print("======================");
  print("Opening file: $filename");
  print("File content: $content");
  
  // TODO: Scrivi il tuo codice qui sotto
  // Usa la struttura try-catch-finally per simulare l'elaborazione del file
  // - Nel blocco try: controlla se errorSimulation è uguale a "error" e, in tal caso, genera un'eccezione
  // - Nel blocco catch: gestisci qualsiasi eccezione
  // - Nel blocco finally: esegui sempre le operazioni di pulizia
  
}
quiz iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di Logica e flusso

Esercitati da solo: Compilatore Dart online