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.