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.
Desafio
FácilCrie 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.
- Leia uma entrada de string representando o nome do arquivo a ser processado
- Leia uma entrada de string representando o conteúdo do arquivo
- Leia uma entrada de string representando se deve simular um erro (
"error"ou"success") - Use uma estrutura
try-catch-finallypara 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 - 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 successfullySe 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 errorsSe 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 successfullySeu 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
}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
1Manipulação Avançada de Listas
Propriedades de Lista: first & lastEstado da Lista: isEmpty & isNotEmptyInvertendo uma ListaAdicionando a uma Lista: insertRemoção em Listas: removeWhereBuscando em uma Lista: indexOfOrdenando uma ListaEmbaralhando uma ListaRecapitulação - Organizador de Listas4Manipulação Avançada de Mapas
Iterando sobre um MapVerificando Chaves e ValoresPropriedades do Map: keys & valuesAdição Condicional: putIfAbsentRemovendo Entradas de um MapMaps AninhadosRecapitulação - Atualização de Inventário2Operações Funcionais em Listas
Transformando com 'map'Filtrando com 'where'Usando '.toList()'Verificando Condições com 'any'Condições com 'every'Encontrando com 'firstWhere'Recapitulação - Filtragem de Dados5Projeto: Cálculo de Carrinho de Compras
Configuração do ProjetoAdicionando Itens ao Carrinho3Conjuntos
O que é um Conjunto?Criando um ConjuntoAdicionando e Removendo de ConjuntosVerificando Elementos em um ConjuntoConvertendo uma Lista para um ConjuntoUnião de ConjuntosInterseção de ConjuntosDiferença de ConjuntosRecapitulação - Lista de Convidados Únicos6Tratamento de Erros Básico
O que são Exceções?O Bloco 'try-catch'Capturando Exceções com 'on'O Bloco 'finally'Lançando uma ExceçãoRecapitulação - Divisão Segura