Eu costumava pensar que não, mas ontem eu tive que fazer isso. É um aplicativo que usa Akka (uma implementação de sistema de ator para a JVM) para processar tarefas assíncronas. Um dos atores realiza alguma manipulação de PDF e, como a biblioteca é de buggy, ela morre com um de StackOverflowErrorvez em quando.
O segundo aspecto é que o Akka está configurado para encerrar todo o sistema de atores se algum erro fatal da JVM (por exemplo, StackOverflowError) for detectado.
O terceiro aspecto é que esse sistema ator é incorporado a um aplicativo da Web (por motivos legados, WTF); portanto, quando o sistema do ator é desligado, o aplicativo da Web não é. O efeito líquido é que, em StackOverflowErrornosso aplicativo de processamento de tarefas, torna-se apenas um aplicativo Web vazio.
Como uma solução rápida, eu tive que capturar o StackOverflowErrorser jogado, para que o pool de threads do sistema de atores não fosse destruído. Isso me levou a pensar que talvez às vezes seja bom capturar esses erros, especialmente em contextos como este? Quando há um pool de threads processando tarefas arbitrárias? Ao contrário de um OutOfMemoryError, não consigo imaginar como um StackOverflowErroraplicativo pode deixar um estado inconsistente. A pilha é limpa após esse erro, para que o cálculo possa continuar normalmente. Mas talvez esteja perdendo algo importante.
Além disso, note que sou a favor de corrigir o erro em primeiro lugar (na verdade, eu já corrigi um SOE nesse mesmo aplicativo há alguns dias), mas eu realmente não sei quando isso tipo de situação pode surgir.
Por que seria melhor reiniciar o processo da JVM em vez de capturar a StackOverflowErrormarca, marcar a tarefa como falhada e continuar com meus negócios?
Existe alguma razão convincente para nunca pegar empresas estatais? Exceto "melhores práticas", que é um termo vago que não me diz nada.
StackOverflowExceptions geralmente são devidos a uma cadeia não terminável de chamadas de método - aumentar o espaço da pilha aumentaria o custo da memória de um novo thread sem nenhum benefício.
:-)