Menu
Coddy logo textTech

O Bloco 'finally'

Parte da seção Lógica & Fluxo do Journey de Dart da Coddy — lição 41 de 65.

Às vezes, você precisa de código que seja executado independentemente do que aconteça no seu bloco try-catch. O bloco finally serve exatamente para esse propósito — ele contém código que sempre é executado, ocorra uma exceção ou não.

O bloco finally vem depois dos seus blocos try e catch. Mesmo que o seu código seja executado com sucesso na seção try, ou se uma exceção for capturada e tratada, o bloco finally ainda será executado.

try {
  // Código que pode causar uma exceção
  int result = 10 ~/ 2;
  print("Result: $result");
} catch (e) {
  print("An error occurred: $e");
} finally {
  print("This always runs!");
}

Isso torna o bloco finally perfeito para operações de limpeza, como fechar arquivos, liberar recursos ou registrar que uma operação foi concluída. Não importa o que aconteça no seu tratamento de erros, você pode garantir que determinado código sempre será executado.

challenge icon

Desafio

Fácil

Crie um programa que demonstre o bloco finally implementando um simulador de processamento de arquivos que sempre executa operações de limpeza, independentemente de ocorrer um erro durante o processamento.

  1. Leia uma entrada de string representando o nome do arquivo a ser processado
  2. Leia uma entrada de string representando o conteúdo do arquivo
  3. Leia uma entrada de string representando se deve simular um erro ("error" ou "success")
  4. Use uma estrutura try-catch-finally para simular o processamento do arquivo:
    • No bloco try: Verifique se a simulação de erro é "error" e lance uma exceção com a mensagem "File processing failed" se for verdadeiro, caso contrário, processe o arquivo com sucesso
    • No bloco catch: Manipule qualquer exceção que ocorra durante o processamento
    • No bloco finally: Sempre execute as operações de limpeza, independentemente do sucesso ou falha
  5. Exiba os resultados do processamento no formato exato mostrado abaixo

Por exemplo, se as entradas forem "document.txt", "Hello World", "success", seu programa deve imprimir:

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 as entradas forem "report.pdf", "Annual Report Data", "error", seu programa deve imprimir:

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 as entradas forem "config.json", "{\"setting\": \"value\"}", "success", seu programa deve imprimir:

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

Seu programa deve usar uma estrutura try-catch-finally onde o bloco finally sempre executa as três operações de limpeza na ordem exata mostrada. No bloco try, verifique se a entrada de simulação de erro é igual a "error" e lance uma exceção se for verdadeiro. Se nenhum erro for simulado, conte os caracteres no conteúdo do arquivo usando a propriedade length. O bloco finally deve sempre imprimir as mensagens de limpeza e determinar o status final de conclusão com base no fato de ter ocorrido um erro ou não.

Folha de consulta

O bloco finally contém código que sempre é executado após o try-catch, independentemente de uma exceção ocorrer ou não.

try {
  // Code that might cause an exception
  int result = 10 ~/ 2;
  print("Result: $result");
} catch (e) {
  print("An error occurred: $e");
} finally {
  print("This always runs!");
}

O bloco finally é perfeito para operações de limpeza, como fechar arquivos, liberar recursos ou registrar o status de conclusão.

Experimente você mesmo

import 'dart:io';

void main() {
  // Ler entrada
  String? filename = stdin.readLineSync();
  String? content = stdin.readLineSync();
  String? errorSimulation = stdin.readLineSync();
  
  // Exibir cabeçalho do sistema
  print("File Processing System");
  print("======================");
  print("Opening file: $filename");
  print("File content: $content");
  
  // TODO: Escreva seu código abaixo
  // Use a estrutura try-catch-finally para simular o processamento de arquivo
  // - No bloco try: verifique se errorSimulation é igual a "error" e lance uma exceção se for verdadeiro
  // - No bloco catch: trate qualquer exceção
  // - No bloco finally: sempre execute operações de limpeza
  
}
quiz iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

Todas as lições de Lógica & Fluxo