Tratamento de Erros¶
C++ oferece exceções, retornos, optional/expected, códigos de erro, terminação e assertions. Escolha conforme a falha seja recuperável, esperada, local e representável no tipo.
Exceções¶
Exceções separam retorno normal da propagação e interagem com RAII durante o desempilhamento.
percentage parse_percentage(std::string_view text) {
double value{};
auto const [end, error] = std::from_chars(
text.data(), text.data() + text.size(), value);
if (error != std::errc{} || end != text.data() + text.size()) {
throw std::invalid_argument{"invalid percentage"};
}
return percentage{value};
}
Capture exceções polimórficas por referência para evitar slicing:
Capture onde houver recuperação, tradução no limite ou contexto necessário. Logar e relançar repetidamente duplica ruído.
Garantias de exceção¶
- no-throw: não emite exceções;
- forte: falha não altera estado observável do alvo;
- básica: invariantes e recursos são preservados, mas o estado pode mudar;
- sem garantia: até invariantes podem se perder.
RAII fundamenta, mas garantia forte pode exigir calcular-e-confirmar, copy-and-swap ou transação.
noexcept¶
É uma promessa: exceção que escapa termina o programa. Use somente quando verdadeiro, sobretudo em destrutores e movimentos.
Valores para ausência ou falha¶
std::optional<T>: valor talvez ausente sem motivo;std::expected<T, E>(C++23): valor ou erro tipado;std::error_code: categorias e valores sem exceção;- tipo de domínio: falha específica mais rica.
Não use exceção para terminar laço comum nem Boolean quando causas importarem.
Assertions e contratos¶
Assertions diagnosticam premissas do programador. Não devem executar efeitos necessários nem validar entrada não confiável. Documente pré-condições públicas.
Exercícios¶
- Escolha representação para chave ausente, entrada malformada e falha de disco.
- Dê estratégia de garantia forte ao substituir coleção.
- Explique o perigo de lançar no destrutor durante desempilhamento.