Não é exatamente verdade que "a declaração falha apenas no modo de depuração".
Em Object Oriented Software Construction, 2ª Edição, de Bertrand Meyer, o autor deixa uma porta aberta para verificar as pré-condições no modo de liberação. Nesse caso, o que acontece quando uma asserção falha é que ... uma exceção de violação de asserção é criada! Nesse caso, não há recuperação da situação: algo útil pode ser feito e é gerar automaticamente um relatório de erros e, em alguns casos, reiniciar o aplicativo.
A motivação por trás disso é que as pré-condições são geralmente mais baratas de testar do que invariantes e pós-condições, e que, em alguns casos, a correção e a "segurança" na criação da versão são mais importantes que a velocidade. Para muitas aplicações, a velocidade não é um problema, mas a robustez (a capacidade do programa de se comportar de maneira segura quando seu comportamento não é correto, ou seja, quando um contrato é quebrado).
Você deve sempre deixar as verificações de pré-condição ativadas? Depende. Você decide. Não há resposta universal. Se você estiver criando software para um banco, talvez seja melhor interromper a execução com uma mensagem alarmante do que transferir US $ 1.000.000 em vez de US $ 1.000. Mas e se você estiver programando um jogo? Talvez você precise de toda a velocidade possível e, se alguém conseguir 1000 pontos em vez de 10 por causa de um bug que as condições prévias não capturaram (porque não estão ativadas), azar.
Em ambos os casos, idealmente, você deve ter detectado esse bug durante o teste e deve fazer uma parte significativa de seu teste com as afirmações ativadas. O que está sendo discutido aqui é qual é a melhor política para os casos raros nos quais as pré-condições falham no código de produção em um cenário que não foi detectado anteriormente devido a testes incompletos.
Para resumir, você pode ter afirmações e ainda obter as exceções automaticamente , se as deixar ativadas - pelo menos em Eiffel. Eu acho que para fazer o mesmo em C ++, você precisa digitá-lo.
Consulte também: Quando as asserções devem permanecer no código de produção?