El bloque 'finally'
Parte de la sección Lógica y Flujo del Journey de Dart de Coddy — lección 41 de 65.
A veces necesitas código que se ejecute sin importar lo que ocurra en tu bloque try-catch. El bloque finally sirve exactamente para este propósito: contiene código que siempre se ejecuta, ocurra o no una excepción.
El bloque finally aparece después de los bloques try y catch. Incluso si el código se ejecuta correctamente en la sección try, o si se captura y maneja una excepción, el bloque finally se ejecutará de todos modos.
try {
// Código que podría causar una excepción
int result = 10 ~/ 2;
print("Result: $result");
} catch (e) {
print("An error occurred: $e");
} finally {
print("This always runs!");
}Esto hace que el bloque finally sea perfecto para operaciones de limpieza como cerrar archivos, liberar recursos o registrar que una operación se ha completado. Independientemente de lo que ocurra en el manejo de errores, puedes garantizar que cierto código siempre se ejecutará.
Desafío
FácilCrea un programa que demuestre el bloque finally implementando un simulador de procesamiento de archivos que siempre realice operaciones de limpieza, independientemente de si ocurre un error durante el procesamiento.
- Lee una entrada de cadena que represente el nombre del archivo a procesar
- Lee una entrada de cadena que represente el contenido del archivo
- Lee una entrada de cadena que represente si se debe simular un error (
"error"o"success") - Usa una estructura
try-catch-finallypara simular el procesamiento de archivos: - En el bloque
try: Verifica si la simulación de error es"error"y lanza una excepción con el mensaje"File processing failed"si es verdadero; de lo contrario, procesa el archivo con éxito - En el bloque
catch: Maneja cualquier excepción que ocurra durante el procesamiento - En el bloque
finally: Realiza siempre las operaciones de limpieza, independientemente del éxito o el fracaso - Muestra los resultados del procesamiento en el formato exacto que se muestra a continuación
Por ejemplo, si las entradas son "document.txt", "Hello World", "success", tu programa debería mostrar:
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 successfullySi las entradas son "report.pdf", "Annual Report Data", "error", tu programa debería mostrar:
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 errorsSi las entradas son "config.json", "{\"setting\": \"value\"}", "success", tu programa debería mostrar:
File Processing System
======================
Opening file: config.json
File content: {"setting": "value"}
Processing file successfully...
File processed: 19 characters found
Cleanup: Closing file handles
Cleanup: Releasing memory resources
Cleanup: Logging operation completion
Processing completed successfullyTu programa debe usar una estructura try-catch-finally donde el bloque finally siempre ejecute las tres operaciones de limpieza en el orden exacto mostrado. En el bloque try, verifica si la entrada de simulación de error es igual a "error" y lanza una excepción si es verdadero. Si no se simula ningún error, cuenta los caracteres en el contenido del archivo usando la propiedad length. El bloque finally siempre debe imprimir los mensajes de limpieza y determinar el estado final de finalización basándose en si ocurrió un error.
Hoja de referencia
El bloque finally contiene código que siempre se ejecuta después de try-catch, independientemente de si ocurre una excepción o no.
try {
// Código que podría causar una excepción
int result = 10 ~/ 2;
print("Result: $result");
} catch (e) {
print("An error occurred: $e");
} finally {
print("This always runs!");
}El bloque finally es perfecto para operaciones de limpieza como cerrar archivos, liberar recursos o registrar el estado de finalización.
Pruébalo tú mismo
import 'dart:io';
void main() {
// Leer entrada
String? filename = stdin.readLineSync();
String? content = stdin.readLineSync();
String? errorSimulation = stdin.readLineSync();
// Mostrar encabezado del sistema
print("File Processing System");
print("======================");
print("Opening file: $filename");
print("File content: $content");
// TODO: Escribe tu código a continuación
// Usa la estructura try-catch-finally para simular el procesamiento de archivos
// - En el bloque try: verifica si errorSimulation es igual a "error" y lanza una excepción si es verdadero
// - En el bloque catch: maneja cualquier excepción
// - En el bloque finally: realiza siempre las operaciones de limpieza
}Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Lógica y Flujo
1Manipulación avanzada de listas
Propiedades de listas: first y lastEstado de la lista: isEmpty y isNotEmptyInvertir una listaAñadir a una lista: insertEliminación en listas: removeWhereBúsqueda en una lista: indexOfOrdenar una listaMezclar una listaResumen - Organizador de listas4Manipulación avanzada de mapas
Iterar sobre un mapaComprobación de claves y valoresPropiedades del mapa: keys y valuesAdición condicional: putIfAbsentEliminar entradas de un mapaMapas anidadosResumen - Actualización de inventario2Operaciones funcionales con listas
Transformar con 'map'Filtrar con 'where'Uso de '.toList()'Comprobar condiciones con 'any'Condiciones con 'every'Búsqueda con 'firstWhere'Resumen - Filtrado de datos5Proyecto: Calculadora de carrito de compras
Configuración del proyectoAgregar artículos al carrito3Conjuntos
¿Qué es un Conjunto?Crear un ConjuntoAñadir y eliminar elementos de un ConjuntoComprobar elementos en un ConjuntoConvertir una lista en un ConjuntoUnión de ConjuntosIntersección de ConjuntosDiferencia de ConjuntosResumen - Lista de invitados única6Manejo básico de errores
¿Qué son las excepciones?El bloque 'try-catch'Capturar excepciones con 'on'El bloque 'finally'Lanzar una excepciónResumen - División segura