Menu
Coddy logo textTech

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á.

challenge icon

Desafío

Fácil

Crea 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.

  1. Lee una entrada de cadena que represente el nombre del archivo a procesar
  2. Lee una entrada de cadena que represente el contenido del archivo
  3. Lee una entrada de cadena que represente si se debe simular un error ("error" o "success")
  4. Usa una estructura try-catch-finally para 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
  5. 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 successfully

Si 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 errors

Si 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 successfully

Tu 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
  
}
quiz iconPonte a prueba

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