Sobes.tech
Junior

O que são exceções em C++?

sobes.tech IA

Resposta da IA

Mecanismo de tratamento de situações anómalas (erros) que ocorrem durante a execução do programa. Permite separar o código responsável pela lógica do programa do código de tratamento de erros.

Palavras-chave:

  • try: Define um bloco de código onde podem ocorrer exceções.
  • catch: Define um bloco de código que é executado quando ocorre um tipo específico de exceção.
  • throw: Gera (cria) uma exceção. O tipo de exceção pode ser qualquer objeto.

Princípio de funcionamento:

  1. O código que pode causar um erro é colocado no bloco try.
  2. Se uma exceção ocorrer no bloco try (gerada com throw), a execução normal do programa é interrompida.
  3. O sistema procura um bloco catch adequado capaz de lidar com a exceção gerada (por tipo).
  4. Se um catch correspondente for encontrado, seu código é executado.
  5. Se um catch adequado não for encontrado no nível atual de chamadas, a exceção é "propagada" para cima na pilha de chamadas até que uma função de tratamento adequada seja encontrada (ou o programa termine incorretamente).

Exemplo:

#include <iostream>
#include <stdexcept> // Para tipos padrão de exceções

int divide(int a, int b) {
    if (b == 0) {
        throw std::runtime_error("Divisão por zero!"); // Gera uma exceção
    }
    return a / b;
}

int main() {
    try {
        int result = divide(10, 0); // Chama uma função que pode lançar exceção
        std::cout << "Resultado: " << result << std::endl; // Esta linha não será executada
    } catch (const std::runtime_error& e) { // Captura a exceção do tipo std::runtime_error
        std::cerr << "Erro: " << e.what() << std::endl; // Processa a exceção
    } catch (...) { // Captura qualquer outra exceção (ponto de suspensão)
        std::cerr << "Ocorreu um erro desconhecido." << std::endl;
    }

    std::cout << "O programa continua após o tratamento do erro." << std::endl;
    return 0;
}

Vantagens:

  • Separação da lógica e do tratamento de erros.
  • Simplificação do fluxo principal do código.
  • Capacidade de tratar erros em diferentes níveis da hierarquia de chamadas.

Desvantagens:

  • Pode afetar o desempenho (devido à propagação da pilha).
  • Dificuldade de compreensão do fluxo de execução com múltiplas exceções.
  • Uso incorreto pode levar a vazamentos de recursos (se os recursos não forem liberados ao ocorrer uma exceção antes de sua liberação correta).

Para trabalhar com segurança com recursos na presença de exceções, frequentemente utilizam-se RAII (Resource Acquisition Is Initialization) e ponteiros inteligentes.