Uma vez fui avisado de que um programa C ++ deveria capturar todas as exceções. O raciocínio dado na época era essencialmente o de programas que permitem que exceções surjam fora de main()
um estado zumbi estranho. Foi-me dito isso há vários anos e, em retrospecto, acredito que o fenômeno observado deveu-se à geração prolongada de despejos de núcleo excepcionalmente grandes do projeto em questão.
Na época, isso parecia bizarro, mas convincente. Era totalmente absurdo que o C ++ deveria "punir" os programadores por não capturar todas as exceções, mas as evidências diante de mim pareciam confirmar isso. Para o projeto em questão, os programas que lançaram exceções não capturadas pareciam entrar em um estado zumbi estranho - ou, como suspeito que a causa fosse agora, um processo no meio de um despejo de núcleo indesejado é extraordinariamente difícil de parar.
(Para quem se pergunta por que isso não era mais óbvio na época: o projeto gerou uma grande quantidade de saída em vários arquivos de vários processos que efetivamente obscureceram qualquer tipo de aborted (core dumped)
mensagem e, nesse caso em particular, o exame post mortem dos core dumps não foi É uma técnica importante de depuração, para que os despejos principais não sejam levados em consideração.Os problemas com um programa geralmente não dependem do estado acumulado de muitos eventos ao longo do tempo por um programa de longa duração, mas das entradas iniciais de um programa de curta duração (< 1 hora), por isso era mais prático executar novamente um programa com as mesmas entradas de uma compilação de depuração ou em um depurador para obter mais informações.)
Atualmente, não tenho certeza se existe alguma grande vantagem ou desvantagem de capturar exceções apenas com o objetivo de impedir a saída de exceções main()
.
A pequena vantagem em que posso pensar em permitir que as exceções surjam main()
é que ele faz com que o resultado std::exception::what()
seja impresso no terminal (pelo menos nos programas compilados pelo gcc no Linux). Por outro lado, isso é fácil de obter, capturando todas as exceções derivadas std::exception
e imprimindo o resultado std::exception::what()
e, se é desejável imprimir uma mensagem de uma exceção que não deriva std::exception
, ela deve ser capturada antes de sair main()
para imprimir a mensagem.
A modesta desvantagem em que consigo pensar em permitir que exceções passem despercebidas main()
é que podem ser gerados despejos de núcleo indesejados. Para um processo que utiliza uma grande quantidade de memória, isso pode ser um incômodo e o controle do comportamento de dumping do núcleo de um programa requer chamadas de função específicas do SO. Por outro lado, se um dump e saída de núcleo forem desejados, isso poderá ser alcançado a qualquer momento chamando std::abort()
e uma saída sem dump de núcleo poderá ser alcançada a qualquer momento chamando std::exit()
.
Curiosamente, acho que nunca vi a what(): ...
mensagem padrão impressa por um programa amplamente distribuído ao travar.
Quais são os argumentos fortes, a favor ou contra, para permitir que as exceções do C ++ passem despercebidas main()
?
Edit: Existem muitas perguntas gerais sobre manipulação de exceções neste site. Minha pergunta é especificamente sobre exceções de C ++ que não podem ser tratadas e foram feitas até o fim main()
- talvez uma mensagem de erro possa ser impressa, mas é um erro de parada imediatamente exibido.