Tratamento de Erros
Você pode ter encontrado o termo erro de tempo de execução em capítulos anteriores. Um erro de tempo de execução é um erro que ocorre enquanto o programa está em execução – daí o nome "erro de tempo de execução".
Normalmente, quando ocorre um erro de tempo de execução, o programa trava ou para de responder.
O compilador pode ajudar apontando a maioria dos erros em nosso código, mas erros de tempo de execução são, em sua maioria, imprevisíveis e geralmente dependem de parâmetros incertos.
Por exemplo, caso o caminho do arquivo passado para StreamReader seja inválido ou não exista, ocorrerá um erro de tempo de execução e o programa irá travar. Portanto, frequentemente colocamos esse tipo de código perigoso em blocos try-catch para tentar executar algum código e, caso ele falhe, capturamos e tratamos o erro ao invés de causar a falha do programa.
A seguir está a sintaxe do bloco try-catch:
index.cs
1234567try { // code to try } catch (Exception errorVar) { // code to handle error }
Aqui, Exception é uma palavra-chave que representa o tipo de dado Exception.
Exemplo
index.cs
1234567891011121314151617using System; using System.IO; class Program { static void Main(string[] args) { try { new StreamWriter("C:/a/random/path/that/does/not/exist.txt"); } catch(Exception error) { Console.WriteLine(error.Message); } } }
Podemos omitir a parte (Exception error) da instrução catch se não estivermos utilizando error.
A seguir estão alguns casos comuns em que um erro de tempo de execução pode ocorrer:
Divisão por zero
index.cs
123456789101112131415161718using System; class Program { static void Main(string[] args) { try { int a = 100; int b = 0; int result = a / b; } catch { Console.WriteLine("ERROR: Division by Zero."); } } }
Índice Inválido de um Array ou Lista
index.cs
1234567891011121314151617using System; class Program { static void Main(string[] args) { try { var exampleArray = new int[10]; Console.WriteLine(exampleArray[20]); } catch { Console.WriteLine("ERROR: The array index is out of bounds."); } } }
Chave Não Encontrada (para Dicionários):
index.cs
123456789101112131415161718192021using System; using System.Collections.Generic; class Program { static void Main(string[] args) { try { Dictionary<string, string> myDict = new Dictionary<string, string> { { "key1", "value1" } }; Console.WriteLine(myDict["key2"]); } catch { Console.WriteLine("Error: Key not found"); } } }
O Bloco finally
Existe também um bloco de código opcional chamado finally, que é executado após o bloco catch ser executado. O bloco finally sempre será executado após os blocos try e catch, independentemente de uma exceção ter sido lançada ou não. Isso garante que qualquer código dentro de finally seja executado todas as vezes, tornando-o útil para tarefas como fechar arquivos ou liberar recursos.
index.cs
12345678910111213141516171819202122232425using System; using System.Collections.Generic; class Program { static void Main(string[] args) { try { Dictionary<string, string> myDict = new Dictionary<string, string> { { "key1", "value1" } }; Console.WriteLine(myDict["key2"]); } catch { Console.WriteLine("Error: Key not found"); } finally { Console.WriteLine("This line will show after the error"); } } }
1. Qual será a saída do seguinte programa?
2. Em C#, qual é o propósito do bloco finally?
3. Qual das seguintes afirmações é verdadeira em relação ao bloco try-catch em C#?
Obrigado pelo seu feedback!
Pergunte à IA
Pergunte à IA
Pergunte o que quiser ou experimente uma das perguntas sugeridas para iniciar nosso bate-papo
What are some other examples of runtime errors?
Can you explain how the try-catch block works with a code example?
What is the difference between compile-time and runtime errors?
Awesome!
Completion rate improved to 2.04
Tratamento de Erros
Deslize para mostrar o menu
Você pode ter encontrado o termo erro de tempo de execução em capítulos anteriores. Um erro de tempo de execução é um erro que ocorre enquanto o programa está em execução – daí o nome "erro de tempo de execução".
Normalmente, quando ocorre um erro de tempo de execução, o programa trava ou para de responder.
O compilador pode ajudar apontando a maioria dos erros em nosso código, mas erros de tempo de execução são, em sua maioria, imprevisíveis e geralmente dependem de parâmetros incertos.
Por exemplo, caso o caminho do arquivo passado para StreamReader seja inválido ou não exista, ocorrerá um erro de tempo de execução e o programa irá travar. Portanto, frequentemente colocamos esse tipo de código perigoso em blocos try-catch para tentar executar algum código e, caso ele falhe, capturamos e tratamos o erro ao invés de causar a falha do programa.
A seguir está a sintaxe do bloco try-catch:
index.cs
1234567try { // code to try } catch (Exception errorVar) { // code to handle error }
Aqui, Exception é uma palavra-chave que representa o tipo de dado Exception.
Exemplo
index.cs
1234567891011121314151617using System; using System.IO; class Program { static void Main(string[] args) { try { new StreamWriter("C:/a/random/path/that/does/not/exist.txt"); } catch(Exception error) { Console.WriteLine(error.Message); } } }
Podemos omitir a parte (Exception error) da instrução catch se não estivermos utilizando error.
A seguir estão alguns casos comuns em que um erro de tempo de execução pode ocorrer:
Divisão por zero
index.cs
123456789101112131415161718using System; class Program { static void Main(string[] args) { try { int a = 100; int b = 0; int result = a / b; } catch { Console.WriteLine("ERROR: Division by Zero."); } } }
Índice Inválido de um Array ou Lista
index.cs
1234567891011121314151617using System; class Program { static void Main(string[] args) { try { var exampleArray = new int[10]; Console.WriteLine(exampleArray[20]); } catch { Console.WriteLine("ERROR: The array index is out of bounds."); } } }
Chave Não Encontrada (para Dicionários):
index.cs
123456789101112131415161718192021using System; using System.Collections.Generic; class Program { static void Main(string[] args) { try { Dictionary<string, string> myDict = new Dictionary<string, string> { { "key1", "value1" } }; Console.WriteLine(myDict["key2"]); } catch { Console.WriteLine("Error: Key not found"); } } }
O Bloco finally
Existe também um bloco de código opcional chamado finally, que é executado após o bloco catch ser executado. O bloco finally sempre será executado após os blocos try e catch, independentemente de uma exceção ter sido lançada ou não. Isso garante que qualquer código dentro de finally seja executado todas as vezes, tornando-o útil para tarefas como fechar arquivos ou liberar recursos.
index.cs
12345678910111213141516171819202122232425using System; using System.Collections.Generic; class Program { static void Main(string[] args) { try { Dictionary<string, string> myDict = new Dictionary<string, string> { { "key1", "value1" } }; Console.WriteLine(myDict["key2"]); } catch { Console.WriteLine("Error: Key not found"); } finally { Console.WriteLine("This line will show after the error"); } } }
1. Qual será a saída do seguinte programa?
2. Em C#, qual é o propósito do bloco finally?
3. Qual das seguintes afirmações é verdadeira em relação ao bloco try-catch em C#?
Obrigado pelo seu feedback!