Menu
CoddyTech

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 genérico 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 genérico usa três pontos (...) em vez de especificar um tipo de exceção específico. Ele deve ser colocado após todos os outros blocos catch, já que 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 genérico 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 gerar 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 executar operações de limpeza para manter seu programa funcionando sem problemas.

challenge icon

Desafio

Fácil

Crie um programa que demonstre o tratamento abrangente de exceções usando vários blocos catch, incluindo um manipulador genérico. Este desafio testará sua compreensão de como tratar tanto tipos específicos de exceção quanto erros inesperados que não se enquadram em categorias predefinidas.

As seguintes entradas serão fornecidas:

  • Uma string testType que representa o tipo de teste a ser realizado ("string_convert", "math_operation", "array_access" ou "unknown_error")
  • Uma string value1 que será usada como dado principal da operação
  • Uma string value2 que será usada como dado secundário em algumas operações

Seu programa deve:

  1. Criar uma função chamada performTest que receba três parâmetros do tipo string
  2. Dentro da função, usar uma estrutura if-else para tratar diferentes tipos de teste:
  3. Se testType for "string_convert": usar std::stoi para converter value1 em um número inteiro e imprimi-lo
  4. Se testType for "math_operation": converter value1 e value2 em números inteiros usando std::stoi, depois dividir value1 por value2 e imprimir o resultado
  5. Se testType for "array_access": criar uma string "Programming", converter value1 em um índice inteiro usando std::stoi e, em seguida, usar str.at(index) para acessar e imprimir o caractere nesse índice. O método .at() lança automaticamente std::out_of_range se o índice for inválido: não é necessário verificar manualmente os limites
  6. Se testType for "unknown_error": lançar um valor inteiro 999
  7. Na função principal, chamar performTest dentro de um bloco try
  8. Usar vários blocos catch para tratar exceções nesta ordem exata:
  9. Primeiro: std::invalid_argument& para conversões inválidas de string para número
  10. Segundo: std::out_of_range& para números grandes demais ou índices de string fora dos limites
  11. Terceiro: catch(...) como manipulador genérico 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 caught

Lembre-se de que o manipulador genérico catch(...) deve ser colocado por último, pois C++ verifica os blocos catch em ordem. Esse manipulador captura 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 genérico oferece uma proteção contra erros inesperados, ao mesmo tempo que permite o tratamento específico dos 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() {
    // Leia a 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;
}
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

Pratique por conta própria: Compilador de C++ online