RAII vs. exceções

Quanto mais usamos RAII em C ++, mais nos encontramos com destruidores que fazem desalocação não-trivial. Agora, a desalocação (finalização, como você quiser chamá-la) pode falhar, e nesse caso as exceções são realmente a única maneira de permitir que qualquer pessoa do andar de cima saiba do nosso problema de desalocação. Mas, novamente, jogando-destruidores são uma má idéia por causa da possibilidade de exceções serem lançadas durante o desenrolamento da pilha.std::uncaught_exception() permite que você saiba quando isso acontece, mas não muito mais, então, além de permitir que você registre uma mensagem antes do término, não há muito o que fazer, a menos que você esteja disposto a deixar seu programa em um estado indefinido, onde algumas coisas são desalocadas / finalizadas e outros não.

Uma abordagem é ter destruidores sem lance. Mas em muitos casos isso apenas esconde um erro real. Nosso destruidor pode, por exemplo, estar fechando algumas conexões de BD gerenciadas por RAII como resultado de alguma exceção sendo lançada, e essas conexões de BD podem falhar ao fechar. Isso não significa necessariamente que estamos bem com o término do programa neste momento. Por outro lado, registrar e rastrear esses erros não é realmente uma solução para todos os casos; caso contrário, não teríamos necessidade de exceções para começar. Com os destruidores sem lance, também nos encontramos tendo que criar funções "reset ()" que deveriam ser chamadas antes da destruição - mas isso apenas anula todo o propósito do RAII.

Outra abordagem é apenas paradeixe o programa terminar, como é a coisa mais previsível que você pode fazer.

Algumas pessoas sugerem encadear exceções, para que mais de um erro possa ser manipulado por vez. Mas eu sinceramente nunca realmente vi isso feito em C ++ e não tenho idéia de como implementar uma coisa dessas.

Então é RAII ou exceções. Não é? Estou inclinado a destruidores sem jogadas; principalmente porque mantém as coisas simples (r). Mas eu realmente espero que haja uma solução melhor, porque, como eu disse, quanto mais usamos RAII, mais nos encontramos usando doutores que fazem coisas não-triviais.

Apêndice

Estou adicionando links para artigos interessantes e discussões sobre tópicos que encontrei:

Jogando DestrutoresDiscussão do StackOverflow noproblemas com o SEHDiscussão do StackOverflow emjogando-destruidores (obrigado, Martin York)Joel em exceçõesSEH Considerado NocivoManipulação de exceção de CLR que também toca em encadeamento de exceçãoHerb Sutter em std :: uncaught_exception e porque não é tão útil quanto você pensaDiscussão histórica sobre o assunto com participantes interessantes (por muito tempo!)Stroustrup explicandoRAIIAndrei Alexandrescu'sGuarda de escopo

questionAnswers(7)

yourAnswerToTheQuestion