Java - existe uma maneira padrão de coletar exceções?

Eu tenho um programa Java que analisa vários arquivos de entrada diferentes. Mesmo quando um erro é encontrado nesses arquivos de entrada, a análise ainda pode continuar e coletar vários outros erros também. Então, o que eu quero fazer é, em vez de lançar e executar uma exceção e parar o processo de análise, gostaria de registrar a exceção em algum lugar e continuar analisando e coletando vários outros erros da mesma maneira, e no final, quero verificar se quaisquer erros são relatados e falham ou continuam dependendo disso.

Claro que sempre posso fazer isso manualmente escrevendo ExceptionRegister ou qualquer outra classe, mas quero saber duas coisas:

1) Há algum problema com essa abordagem? Você conhece algum design alternativo para o que eu quero fazer?

2) Existe uma maneira padrão de fazer isso? (por exemplo, em vez de rolar minhas próprias classes, eu gostaria de usar a funcionalidade interna, se possível)

obrigado

Edição: Eu não sei por que, mas alguém acabou de remover sua resposta pouco antes de eu aceitá-la. Enfim, acho que estruturas simples de dados devem funcionar. Basicamente, escreverei uma classe de exceção que coleta várias mensagens de erro. Então chamarei de método throw que se lança se tiver pelo menos uma mensagem de erro registrada.

EDIT2: Aqui estão mais esclarecimentos. Meu problema não tem nada a ver com a análise. A análise foi apenas um exemplo, porque meu programa faz algumas análises. Pense no seguinte: estou executando um algoritmo e, no caso de um erro, posso continuar com o algoritmo para coletar mais erros, para que, em vez de imprimir um erro e, quando for corrigido, imprima o segundo erro, eu possa imprimir esses dois erros juntos.

Resposta 1

Exceções realmente devem ser usadas quando você não aguenta mais a entrada. Eles são o caso especial em que seu código diz "Desisto, estou perdendo algumas informações ou não fui feito para isso". Essa é uma área cinzenta de como definir esses casos, mas a filosofia usual, conforme apresentada por Bill Venners neste artigo (antigo!), É:

Evite usar exceções para indicar condições razoavelmente esperadas como parte do funcionamento típico do método.

No seu caso, parece que o conteúdo que você precisa analisar pode estar incorreto, mas isso é esperado pelo seu programa e não quebra o contrato o suficiente para interromper a análise. Por outro lado, uma exceção aceitável seria válida para uso se um erro na sintaxe da entrada fizer com que o restante da interpretação falhe, por exemplo.

Mas as pessoas ainda usam exceções porque são bastante convenientes para interromper a execução e subir a pilha sem entrar nos detalhes tediosos de fluir através dos retornos dos resultados. Mas, por outro lado, eles podem ter resultados complicados à medida que você deixa algum estado autônomo em alguns objetos.

Seus requisitos parecem mais com um padrão de validação do que com uma única exceção que pode causar a interrupção do processamento. Uma exceção para interromper todo o processamento: se você lançar uma, o restante será ignorado. Mas você sugeriu que você os colecionaria em vez de jogá-los. Então, eu diria, nesse caso, por que usar exceções? Parece que você deseja retornar resultados adequados e não interromper a execução do programa.

Porque se você ainda seguir esse caminho, poderá ter uma coleção de exceções para lançar no final. Qual você joga? Qual deles tem precedência, no coletor de exceção que você criou?

Tomemos o exemplo do Eclipse, que possui esta plataforma gigantesca para lidar com uma enorme contribuição de plug-ins de coleção. Eles usam um canal de comunicação adequado para registrar qualquer aviso e erro, no painel de problemas ou na execução da tarefa em segundo plano . A execução deste último geralmente retornará um objeto IStatus ou uma variante. Com base nesse IStatusobjeto, o código que recebe o status decide agir sobre ele.

Portanto, pessoalmente, eu desenvolvia um objeto semelhante que coletaria todos os erros necessários do usuário (e não os erros do programa), que não interrompem a execução do programa e uma parte aceitável do contrato. Esse objeto pode conter a gravidade do erro, sua origem, uma dica sobre como corrigi-lo (pode ser uma cadeia de caracteres ou mesmo um método que contém uma lógica de identificação para mostrar o erro ou possivelmente uma correção parcial automatizada), etc. .. Depois que a execução for concluída, o resultado da análise obterá esses objetos de status e atuará sobre ele. Se houver erros, informe o usuário por meio da interface do usuário e faça logon também.

Portanto, é basicamente a mesma abordagem que você sugeriu inicialmente, menos as exceções e a comodidade de saltar pela pilha que pode levar a efeitos colaterais desagradáveis ​​e erros de depuração muito difíceis.

Resposta: 2

Estou tentando executar um PURGE com HttpUrlConnection como este: private void callVarnish (URL da URL) {HttpURLConnection conn = null; tente {conn = (HttpURLConnection) url.openConnection (...

Eu tenho trabalhado em uma tarefa na qual preciso ler palavras de um arquivo e encontrar a palavra mais longa e verificar quantas subpalavras contêm nessa palavra mais longa? isso deve funcionar para todas as palavras ...

Estamos no processo de migração do MySql para o MariaDB devido a motivos de licenciamento / uso comercial. Substituímos com êxito o jar do conector MySql pelo jar do cliente MariaDB (primeira alteração) e estamos ...

Estou tentando enviar um email usando o servidor de email da minha empresa. Mas estou recebendo a seguinte exceção Causada por: com.sun.mail.smtp.SMTPSendFailedException: 530 5.7.1 O cliente não foi autenticado ...