C++:
Tratamento de erros

Como fazer:

Aqui está um bloco básico try-catch para tratar uma exceção:

#include <iostream>
#include <stdexcept>

int main() {
    try {
        throw std::runtime_error("Ops! Algo deu errado.");
    } catch (const std::exception& e) {
        std::cerr << "Erro: " << e.what() << std::endl;
    }
    return 0;
}

Saída de exemplo:

Erro: Ops! Algo deu errado.

Aprofundamento

C++ tem tratamento de erros desde seus primeiros dias. A forma mais básica era verificar os valores de retorno. Se você tem experiência, deve se lembrar dos dias pré-padrão: C com classes e verificação de erros manual.

Depois vieram as exceções com C++ para nos dar uma maneira estruturada de lidar com problemas inesperados. Uma exceção é lançada com throw e capturada com try/catch.

Dois tipos de erros costumam aparecer: erros lógicos, como um cálculo errado, e erros de execução, como acessar um endereço de memória inválido. Exceções são ideais para erros de execução. Para erros lógicos, é frequentemente melhor usar asserções ou códigos de erro.

Há um debate contínuo sobre exceções versus códigos de erro. Exceções podem ser mais lentas e podem levar a fluxos de controle complexos. Códigos de erro, embora mais rápidos, podem tornar o código confuso e mais difícil de manter. É uma questão de compensação, então conhecer o seu caso de uso é fundamental.

O C++17 introduziu std::optional e std::variant, que são alternativas às exceções. São úteis para funções que podem ou não retornar um resultado válido.

A segurança de exceções pode ser outra dor de cabeça. Trata-se das garantias que seu código oferece apesar das exceções. Existem três níveis: básico, forte e nothrow. Quanto mais garantias, mais complexo pode ser o seu código.

Pensamentos finais — o tratamento de erros é tanto arte quanto ciência. Ele molda como sua aplicação sobrevive no mundo real. Não abuse das exceções. Mire em um código legível e que possa ser mantido.

Veja Também