Quando apanhar café.idioma.Erro?

Em que situações se deve apanhar um pedido?

Author: Laurel, 2008-12-09

16 answers

Geralmente, nunca. No entanto, às vezes você precisa pegar erros específicos.

Se está a escrever o código framework-ish (a carregar classes de terceiros), pode ser sensato apanhar erros de ligação (não foi encontrado nenhum def de classe, ligação insatisfeita, mudança de classe incompatível). Também vi um código de terceira-festa estúpido a lançar sub-séries de erros, por isso vais ter de lidar com estes também.

A propósito, não sei se é possível recuperar-se do passado.
 90
Author: Yoni Roit, 2008-12-09 14:12:02
Nunca. Você nunca pode ter certeza de que o aplicativo é capaz de executar a próxima linha de código. Se você tiver um {[[0]}, você não tem nenhuma garantia de que você será capaz de fazer qualquer coisa de forma confiável {[[4]}. Catch RuntimeException and checked Exceptions, but never Errors.

Http://pmd.sourceforge.net/rules/strictexception.html

 46
Author: tronda, 2017-05-23 12:26:20

Geralmente você deve sempre pegar {[[1]} e escrevê-lo em um registro ou mostrá-lo ao usuário. Eu trabalho em apoio e vejo diariamente que os programadores não podem dizer o que aconteceu em um programa.

Se você tem um tópico do daemon então você deve evitar que ele seja terminado. Em outros casos, sua aplicação funcionará corretamente.

Só se deve apanhar java.lang.Error ao nível mais alto.

Se olhar para a lista de erros verá que a maioria pode ser tratada. Por exemplo a ZipError ocorre ao ler ficheiros zip corrompidos.

Os erros mais comuns são OutOfMemoryError e NoClassDefFoundError, que são ambos na maioria dos casos problemas de tempo de execução.

Por exemplo:

int length = Integer.parseInt(xyz);
byte[] buffer = new byte[length];

Pode produzir um OutOfMemoryError mas é um problema de tempo de execução e não há razão para terminar o seu programa.

NoClassDefFoundError ocorrer principalmente se uma biblioteca não estiver presente ou se você trabalhar com outra versão Java. Se é uma parte opcional do seu programa, então você não deve terminar o seu programa.

Eu posso dar muitos mais exemplos de por que é uma boa idéia pegar Throwable no nível superior e produzir uma mensagem de erro útil.

 15
Author: Horcrux7, 2015-06-11 14:40:14
Em ambiente multithreaded, você mais frequentemente quer pegá-lo! Quando o apanharem, registem-no e acabem com a aplicação toda! Se você não fizer isso, algum fio que pode estar fazendo alguma parte crucial estaria morto, e o resto da aplicação vai pensar que tudo está normal. Fora disso, muitas situações indesejadas podem acontecer. Um pequeno problema é que você não seria capaz de encontrar facilmente a raiz do problema, se outros threads começar a atirar algumas exceções por causa de um tópico não trabalho. Por exemplo, o laço deve ser:
try {
   while (shouldRun()) {
       doSomething();
   }
}
catch (Throwable t) {
   log(t);
   stop();
   System.exit(1);
}

Mesmo, em alguns casos, você gostaria de lidar com diferentes Erros de forma diferente, por exemplo, no OutOfMemoryError você seria capaz de fechar o aplicativo regularmente (mesmo talvez libere memória e continuar), em alguns outros, não há muito que você pode fazer.

 13
Author: Sarmun, 2009-03-08 11:45:55

Muito raramente.

Eu diria apenas no nível superior de um fio para tentar emitir uma mensagem com a razão de um fio a morrer. Se você está em uma estrutura que faz esse tipo de coisa por você, deixe isso para a estrutura.
 7
Author: Darron, 2008-12-09 14:15:27
Quase nunca. Erros são projetados para serem questões que as aplicações geralmente não podem fazer nada sobre. A única exceção pode ser lidar com a apresentação do erro, mas mesmo que não pode ir como planejado, dependendo do erro.
 6
Author: nicerobot, 2008-12-09 13:59:06

Um Error, normalmente, não deve ser pego, como indica uma condição anormal que nunca deve ocorrer.

Da especificação da API Java para a Error classe:

An Error é uma subclasse de Throwable isso indica problemas graves que uma aplicação razoável não deve tentar pegar. A maioria desses erros são condições anormais. [...]

Não é necessário um método para declarar em sua cláusula de arremesso qualquer subclasses de Erro que pode ser jogado durante o execução do método, mas não apanhado, uma vez que estes erros são condições anormais que nunca deveriam ocorrer.

Como a especificação menciona, um {[[0]} só é jogado em circunstâncias que são As Chances são de que, quando um Error ocorre, há muito pouco que o aplicativo pode fazer, e, em algumas circunstâncias, a Máquina Virtual Java em si, pode ser em um estado instável (como VirtualMachineError)

Embora um Error é uma subclasse de Throwable o que significa que pode ser capturada por uma cláusula try-catch, mas provavelmente não é realmente necessária, pois a aplicação estará num estado anormal quando um Error é lançado pelo JVM.

Existe também uma pequena secção sobre este tópico na secção 11.5 A hierarquia de excepções da especificação da linguagemJava, 2.A edição .

 6
Author: coobird, 2008-12-09 14:37:32

Se você é louco o suficiente para estar a criar uma nova estrutura de teste unit, o seu test runner provavelmente vai precisar de apanhar java.idioma.Erro de afirmação de qualquer caso de teste.

Caso contrário, consulte outras respostas.
 6
Author: noahlz, 2008-12-10 20:44:45
E há outros casos em que se apanhares um erro, tenho de repensar. Por exemplo ThreadDeath nunca deve ser pego, pode causar um grande problema é você pegá-lo em um ambiente contido (por exemplo. um servidor de aplicações):

Uma aplicação só deve capturar instâncias desta classe se tiver de limpar depois de ser exterminado assíncronamente. Se o ThreadDeath for apanhado por um método, é importante que ele seja derrubado assim que o fio realmente morre.

 5
Author: Guillaume, 2008-12-09 14:09:10

Muito, muito raramente.

Só o fiz por um caso muito específico. Por exemplo, java.idioma.O erro não declarado poderia ser lançado se dois carregadores independentes carregassem o mesmo DLL. (Eu concordo que eu deveria mover o jarro para um classloader compartilhado)

Mas o caso mais comum é que você precisava de registro para saber o que aconteceu quando o usuário vem reclamar. Você quer uma mensagem ou um popup para o usuário, em vez de silenciosamente morto.

Mesmo programador em C / C++, eles introduza um erro e diga algo que as pessoas não compreendam antes de sair (por exemplo, falha de memória).

 4
Author: Dennis C, 2008-12-09 14:28:55

Numa aplicação Android estou a apanhar um java.idioma.Verificerror . Uma biblioteca que estou usando não vai funcionar em dispositivos com uma versão antiga do SO e o código da biblioteca vai lançar tal erro. Eu poderia, naturalmente, evitar o erro ao verificar a versão do sistema operacional no tempo de execução, mas:

  • O SDK mais antigo suportado poderá mudar no futuro para a biblioteca específica
  • o bloco de erro de tentativa de captura faz parte de um mecanismo de recuo maior. Alguns dispositivos específicos, embora é suposto apoiar a biblioteca, abrir excepções. Apanho o Verificador e todas as excepções para usar uma solução alternativa.
 3
Author: kgiannakakis, 2013-03-14 06:17:07
É muito útil apanhar java.idioma.Erro de afirmação num ambiente de teste...
 3
Author: Jono, 2013-11-27 01:53:46

Idealmente não devemos lidar com erros de captura. Mas pode haver casos em que precisamos de o fazer, com base na exigência de enquadramento ou aplicação. Digamos que tenho um servidor de processamento XML que implementa O analisador de DOM que consome mais memória. Se existir um requisito como o Parser thread não deve ser morto quando ele obtém OutOfMemoryError , em vez disso, ele deve lidar com ele e enviar uma mensagem/mail para o administrador da aplicação/framework.

 2
Author: user3510364, 2014-05-05 18:22:03

Idealmente nunca devemos pegar erro em nossa aplicação Java, pois é uma condição anormal. A aplicação estaria em estado anormal e poderia resultar em carshing ou dar algum resultado seriamente errado.

 1
Author: Vivek, 2011-01-26 06:23:27

Pode ser adequado detectar erros nos testes unitários que permitam verificar uma afirmação. Se alguém desactiva afirmações ou de outra forma apaga a afirmação que você gostaria de saber

 1
Author: Chanoch, 2012-08-19 20:35:49
Há um erro quando a JVM já não está a funcionar como esperado, ou está prestes a fazê-lo. Se você pegar um erro, não há nenhuma garantia de que o bloco de captura vai correr, e ainda menos que ele vai correr até o final.

Ele também vai depender do computador em execução, o estado de memória atual, então não há maneira de testar, tentar e fazer o seu melhor. Só terá um resultado perigoso.

Também diminuirá a legibilidade do seu código.

 1
Author: Nicolas Zozol, 2013-04-23 16:50:35