Finally Block
Parte da seção Lógica & Fluxo do Journey de C# da Coddy — lição 27 de 66.
O bloco finally contém código que sempre é executado, independentemente de uma exceção ocorrer ou não, mesmo se houver uma instrução return nos blocos try ou catch.
Crie uma estrutura básica try-catch-finally:
try
{
// Code that might throw an exception
int result = 10 / 2;
Console.WriteLine("Result: " + result);
}
catch (DivideByZeroException ex)
{
// Code that handles the exception
Console.WriteLine("Cannot divide by zero: " + ex.Message);
}
finally
{
// Code that always executes
Console.WriteLine("This always executes");
}
O bloco finally é útil para tarefas de limpeza, como fechar arquivos ou conexões de banco de dados:
System.IO.StreamReader file = null;
try
{
file = new System.IO.StreamReader("data.txt");
string content = file.ReadToEnd();
Console.WriteLine(content);
}
catch (System.IO.FileNotFoundException)
{
Console.WriteLine("File not found.");
}
finally
{
// Sempre feche o arquivo, mesmo se uma exceção ocorrer
if (file != null)
{
file.Close();
}
}
Desafio
FácilCrie um método chamado ProcessData que:
- Recebe um parâmetro string representando um nome de arquivo
- Tenta abrir o arquivo e ler seu conteúdo
- Escreve o conteúdo no console
- Limpa adequadamente os recursos usando um bloco finally
- Trata FileNotFoundException e IOException
Se o arquivo não puder ser encontrado, imprima: "ERROR: File not found: [filename]"
Se outro erro de IO ocorrer, imprima: "ERROR: Could not read the file: [error message]"
Sempre imprima "File operation completed." no bloco finally, independentemente de uma exceção ter ocorrido ou não.
Folha de consulta
O bloco finally contém código que sempre é executado, independentemente de uma exceção ocorrer ou não, mesmo se houver uma instrução return nos blocos try ou catch.
Estrutura básica try-catch-finally:
try
{
// Código que pode lançar uma exceção
int result = 10 / 2;
Console.WriteLine("Result: " + result);
}
catch (DivideByZeroException ex)
{
// Código que lida com a exceção
Console.WriteLine("Cannot divide by zero: " + ex.Message);
}
finally
{
// Código que sempre executa
Console.WriteLine("This always executes");
}
O bloco finally é útil para tarefas de limpeza, como fechar arquivos ou conexões de banco de dados:
System.IO.StreamReader file = null;
try
{
file = new System.IO.StreamReader("data.txt");
string content = file.ReadToEnd();
Console.WriteLine(content);
}
catch (System.IO.FileNotFoundException)
{
Console.WriteLine("File not found.");
}
finally
{
// Sempre feche o arquivo, mesmo se uma exceção ocorreu
if (file != null)
{
file.Close();
}
}
Experimente você mesmo
using System;
using System.IO;
class Program
{
public static void ProcessData(string filename)
{
// Escreva seu código aqui
}
static void Main(string[] args)
{
string filename = Console.ReadLine();
ProcessData(filename);
}
}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
1Multi-dimensional Arrays
2D Arrays BasicsDeclaring and Initializing 2DAccessing 2D Array ElementsNested Loops with 2D ArraysJagged ArraysCommon Matrix OperationsRecap - Multi-dimensional4Flow Control Techniques
Early ReturnsGuard ClausesJump Statements (goto)Break and ContinueFlatten Nested Conditionals7Logical Operators Advanced
Short-Circuit EvaluationConditional Logical OperatorsOperator PrecedenceRecap - Advanced Operators2Advanced Decision Making
Multiple ConditionsComplex Boolean LogicIf vs. Switch ComparisonNested Switch StatementsRecap - Advanced Decisions5Exception Handling
Try-Catch BasicsException TypesMultiple Catch BlocksWorking with FilesFinally BlockUsing vs. Try-FinallyCustom ExceptionsRecap - Error Handling3Loop Enhancements
Loop PerformanceIterating ComplexEach Loop TypeRefactoring LoopsRecap - Optimized Loops6Null Handling
Null Reference BasicsNullable Value TypesNull Checking PatternsDefensive ProgrammingRecap - Null Safety