Pular para conteúdo

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:

try {
    process();
} catch (std::exception const& error) {
    report(error.what());
}

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

  1. Escolha representação para chave ausente, entrada malformada e falha de disco.
  2. Dê estratégia de garantia forte ao substituir coleção.
  3. Explique o perigo de lançar no destrutor durante desempilhamento.