Exceções e testes

Propagação de erros, desenrolamento da pilha, RAII, contratos, testes unitários e sanitizers.

TLDR

Perguntar sobre esta página

ChatGPTClaudePerplexityGrokGeminiCopiar e abrirDeepSeekCopiar e abrir

O que acontece ao lançar?

throw abandona a operação e procura catch compatível. Depois do tratador, continua após o try, nunca na linha seguinte ao throw.

try {
    calcular();  // dividir(12.0, 0.0) lança
} catch (const std::exception& erro) {
    std::cout << erro.what() << '\n';
}
  • Apanha por referência constante. Por valor copia e corta derivadas.
  • Específicos antes dos gerais. throw; relança a atual.
  • Desenrolamento destrói automáticos já construídos, por ordem inversa. Apontador cru não liberta new.
  • Se a construção não termina, o destrutor completo não corre. Membros e bases feitos são limpos.
  • Os destrutores devem libertar recursos sem deixar sair exceções.
  • Se uma exceção escapa de um destrutor chamado durante o desenrolamento, o programa termina com std::terminate. Violar noexcept também termina.

Exceção serve quando a operação falha e o tratamento pertence a outro nível. Entrada previsível pode usar estado de erro.

Que garantia dou?

GarantiaPromessa
BásicaInvariantes e sem fugas, sem prometer o valor
ForteSem efeitos observáveis na falha

Preparar cópia antes de trocar dá forte se a troca não lança.

Que casos testo?

Para contar valores no intervalo [minimo, maximo]:

CasoIntervaloEsperado
Vazio0, 200
{-1, 0, 1, 19, 20, 21}0, 204
{7, 7, 8}7, 72
Limites invertidos5, 40
  • Condição errada min < x && x < max dá 1 em {1, 2, 3} com 1, 3. Usa fronteiras para a apanhar.
  • assert pode desaparecer com NDEBUG. Não valida dados externos nem faz trabalho necessário.
  • Para cópia, altera a cópia e confere o original.
g++ -std=c++17 -Wall -Wextra -Wpedantic -g -O1 -fsanitize=address,undefined -fno-omit-frame-pointer programa.cpp -o programa

Sanitizers só veem caminhos executados. Não correm no navegador. Lê a primeira falha e reduz a entrada.

Propagação com RAII.

À tua maneira

Aparência

Modo de cor
Tema
Cor de destaque

Leitura

Fonte de leitura

Álgebra, lógica e uma ideia de cada vez.

Código

Fonte do código

Navegação

Cursor de leitura, sem edição. h, j, k, l movem; / pesquisa nesta página. v seleciona caracteres; V seleciona linhas; y copia. Tab permite destacar ou comentar. Espaço ou Enter abre blocos recolhíveis. Nos cartões, h, j, k, l mudam o foco.

CSS personalizado

Ativa uma sugestão ou guarda o teu CSS. Só muda este navegador.

Usa --page, --text e --accent para acompanhar o tema.

Seletores e recuperação

.site-header, .prose, .course-card, [data-reading-history], [data-playground] e .page-actions.

Abre a aparência com a tecla vírgula ou no rodapé. Se o CSS esconder os controlos, abre esta página sem CSS personalizado.

Pesquisar

Escreve para pesquisar em todo o site.

para escolher · Enter para abrir · Esc para fechar

Copiar fórmula

A cópia automática não está disponível. Copia o LaTeX abaixo.

Pesquisar nesta página

Enter procura · n / N repetem · Esc cancela. Ctrl / Cmd K pesquisa todo o site.

Atalhos de teclado

Clica numa tecla para a mudar. Esc cancela. Backspace desativa.

PesquisarCtrl / Cmd K

Os atalhos não interferem enquanto escreves. Tab e Enter funcionam sempre.