O Manipulador Catch-All
Parte da seção Lógica & Fluxo do Journey de C++ da Coddy. Lição 52 de 56.
Às vezes, seu programa pode encontrar erros inesperados que não se encaixam nos tipos específicos de exceção para os quais você se preparou. O manipulador abrangente catch(...) oferece uma rede de segurança que captura qualquer exceção que não tenha sido tratada pelos seus blocos catch mais específicos.
O manipulador abrangente usa três pontos (...) em vez de especificar um tipo de exceção específico. Ele deve ser colocado depois de todos os outros blocos catch, pois o C++ os verifica em ordem:
try {
// Código que pode lançar várias exceções
} catch (std::invalid_argument& e) {
std::cout << "Invalid input!" << std::endl;
} catch (std::out_of_range& e) {
std::cout << "Number too large!" << std::endl;
} catch (...) {
std::cout << "An unexpected error occurred!" << std::endl;
}O manipulador abrangente atua como uma alternativa para qualquer tipo de exceção que não tenha sido capturado pelos blocos anteriores. Isso é particularmente útil ao trabalhar com código que pode lançar exceções que você não previu, garantindo que seu programa não trave devido a erros inesperados.
Embora você não possa acessar os detalhes específicos da exceção em um bloco catch-all, ainda pode fornecer uma mensagem de erro genérica e realizar operações de limpeza para manter seu programa funcionando sem problemas.
Desafio
FácilCrie um programa que demonstre o tratamento abrangente de exceções usando vários blocos catch, incluindo um manipulador que captura todos os casos. Este desafio testará sua compreensão de como lidar tanto com tipos específicos de exceção quanto com erros inesperados que não se encaixam em categorias predefinidas.
As seguintes entradas serão fornecidas:
- Uma string
testTyperepresentando o tipo de teste a ser realizado ("string_convert","math_operation","array_access"ou"unknown_error") - Uma string
value1que será usada como os dados principais da operação - Uma string
value2que será usada como dados secundários para algumas operações
Seu programa deve:
- Criar uma função chamada
performTestque receba três parâmetros do tipo string - Dentro da função, usar uma estrutura if-else para lidar com diferentes tipos de teste:
- Se testType for
"string_convert": usarstd::stoipara converter value1 em um inteiro e imprimi-lo - Se testType for
"math_operation": converter value1 e value2 em inteiros usandostd::stoi, depois dividir value1 por value2 e imprimir o resultado - Se testType for
"array_access": criar uma string"Programming", converter value1 em um índice inteiro usandostd::stoi, depois usarstr.at(index)para acessar o caractere nesse índice e imprimi-lo. O método.at()lança automaticamentestd::out_of_rangese o índice for inválido: não é necessário verificar manualmente os limites - Se testType for
"unknown_error": lançar um valor inteiro999 - Na função principal, chamar
performTestdentro de um blocotry - Usar vários blocos
catchpara tratar as exceções nesta ordem exata: - Primeiro:
std::invalid_argument¶ conversões inválidas de string para número - Segundo:
std::out_of_range¶ números grandes demais ou índices de string fora dos limites - Terceiro:
catch(...)como o manipulador que captura todos os casos para quaisquer outros tipos de exceção
Use o seguinte formato exato de saída:
Para operações bem-sucedidas:
Success: [result_value]Para diferentes tipos de exceção:
Invalid argument caught
Out of range caught
Unknown exception caughtLembre-se de que o manipulador que captura todos os casos catch(...) deve ser colocado por último, pois o C++ verifica os blocos catch em ordem. Esse manipulador capturará qualquer tipo de exceção que não tenha sido tratado pelos blocos catch específicos anteriores, incluindo a exceção inteira lançada no caso "unknown_error". O manipulador que captura todos os casos fornece uma rede de segurança para erros inesperados, permitindo ainda um tratamento específico para tipos de exceção conhecidos.
Experimente você mesmo
#include <iostream>
#include <string>
#include <stdexcept>
using namespace std;
// TODO: Escreva seu código aqui - crie a função performTest
int main() {
// Ler entrada
string testType;
string value1;
string value2;
cin >> testType;
cin >> value1;
cin >> value2;
// TODO: Escreva seu código abaixo - implemente blocos try-catch e chame performTest
return 0;
}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
1Ponteiros e Memória
O que é um Ponteiro?Operador de EndereçoOperador de DesreferenciaçãoPonteiros NulosPonteiros e ArraysMemória Dinâmica com 'new'Liberando Memória com 'delete'Recapitulação - Prática com Ponteiros2Vetores (Arrays Dinâmicos)
Introdução ao std::vectorCriando um VetorAdicionando ElementosAcessando ElementosTamanho do VetorIterando com um Loop ForLoop For Baseado em IntervaloRemovendo ElementosRecapitulação - Operações com Vetores5Projeto: Ferramenta de Inventário
Configuração do ProjetoAdicionando e Atualizando Itens8Tratamento Básico de Erros
Introdução a ExceçõesOs Blocos 'try' e 'catch'A Palavra-chave 'throw'Diferentes Tipos de ExceçãoO Manipulador Catch-AllRecapitulação - Divisão Segura3Projeto: Ferramenta de Lista de Tarefas
Visão Geral do ProjetoAdicionando uma TarefaPratique por conta própria: Compilador de C++ online