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.
Sfida
FacileCrea 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.
- Leggi una stringa in input che rappresenta il nome del file da elaborare
- Leggi una stringa in input che rappresenta il contenuto del file
- Leggi una stringa in input che rappresenta se simulare un errore (
"error"oppure"success") - Usa una struttura
try-catch-finallyper 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 - 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 successfullySe 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 errorsSe 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 successfullyIl 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
}Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Tutte le lezioni di Logica e flusso
1Manipolazione avanzata delle liste
Proprietà delle liste: primo e ultimoStato della lista: isEmpty e isNotEmpInvertire una listaAggiungere a una lista: insertRimozione dalla lista: removeWhereRicerca in una lista: indexOfOrdinare una listaMescolare una listaRiepilogo - Organizzatore di liste4Manipolazione avanzata delle mappe
Iterare su una mappaVerificare chiavi e valoriProprietà delle mappe: chiavi e valoriAggiunta condizionale: putIfAbsentRimuovere elementi da una mappaMappe annidateRiepilogo - Aggiornamento dell'inventario2Operazioni funzionali sulle liste
Trasformare con 'map'Filtrare con 'where'Usare '.toList()'Verificare condizioni con 'any'Condizioni con 'every'Trovare con 'firstWhere'Riepilogo - Filtraggio dei dati3Insiemi
Che cos'è un insieme?Creare un insiemeAggiungere e rimuovere elementi dagli insiemiVerificare la presenza di elementi in un insiemeConvertire una lista in un insiemeUnione di insiemiIntersezione di insiemiDifferenza tra insiemiRiepilogo - Lista degli ospiti unici6Gestione di base degli errori
Cosa sono le eccezioni?Il blocco 'try-catch'Gestire le eccezioni con 'on'Il blocco 'finally'Lanciare un'eccezioneRiepilogo - Divisione sicuraEsercitati da solo: Compilatore Dart online