Catch de Error  XML
Índice dos Fóruns » Java Básico
Autor Mensagem
peczenyj
Moderador
[Avatar]

Membro desde: 26/03/2006 23:25:37
Mensagens: 3191
Localização: Rio de Janeiro
Offline

Com try/ catch eu posso pegar qualquer objeto Throwable.
Error é uma classe que extende Throwable.

Faz sentido tratar Erros (da mesma forma que tratamos Exceptions)?

Eu identifiquei uma situação: uma função recursiva que pode consumir todos os recursos da maquina:



Agora... existem outras situações?

http://pacman.blog.br

'Não importa quanto alguém se dedique à tarefa. Ninguém consegue fazer a água da cascata cair para cima.'
[WWW]
Link_pg
JavaEvangelist
[Avatar]

Membro desde: 28/04/2006 00:17:38
Mensagens: 413
Localização: Praia Grande / São Paulo - SP
Offline

Olá!

Possível é possível, como você mesmo disse ao afirmar que Error extende Trowable, mas se for pela lógica não faz sentido capturar um Error, pois quando um desses é lançado a JVM é encerrada... nem chega no catch...

Abraços

Eduardo Felipe Vieira

Blog de Tecnologia!
Outro blog meu legal também mas não é de TI.



"Nós poderíamos ser muito melhores se não quiséssemos ser tão bons."
[Email] [WWW] [MSN]
ViniGodoy
Moderador
[Avatar]

Membro desde: 11/12/2006 08:22:01
Mensagens: 20580
Localização: Curitiba/PR
Offline

Chega no catch sim. Você pode não impedir que a VM aborte, mas você pode gravar num arquivo a causa do erro, antes disso.

Mas geralmente, é mais útil registrar o defaultUncaughtExceptionHandler para isso.

Dê uma olhada na classe Thread e no método setDefaultUncaughtExceptionHandler. É o método que é chamado quando um throwable não é capturado por classe nenhuma, antes da VM abortar. É útil para logar eventuais erros e runtimeexceptions num arquivo, antes do programa cair fora.

Existe também o setUncaughtExceptionHandler, que não é estático, caso você queira registrar um handler diferente para uma thread específica.

This message was edited 1 time. Last update was at 01/03/2008 16:00:31


@ViniGodoy - Lattes

Tem dúvidas de Java? Poste no fórum! Não respondo dúvidas de java via MP!

Ponto V! - Desenvolvimento de Jogos Profissional - @Pontov - Facebook
Projeto Towel - Swing de uma forma inteligente (Novo lar do ObjectTableModel e do Auto-Filtro).

Ei... você está usando DefaultTableModel no seu projeto??
Não faça isso! Veja: http://www.guj.com.br/posts/list/15/199067.java#1001295
[WWW]
Link_pg
JavaEvangelist
[Avatar]

Membro desde: 28/04/2006 00:17:38
Mensagens: 413
Localização: Praia Grande / São Paulo - SP
Offline

Olá!



Eu sempre achei que nem chegava no catch quando um Error é lançado... mas parece ser bem útil nesse seu exemplo...

Abraços

Eduardo Felipe Vieira

Blog de Tecnologia!
Outro blog meu legal também mas não é de TI.



"Nós poderíamos ser muito melhores se não quiséssemos ser tão bons."
[Email] [WWW] [MSN]
danielbussade
JavaEvangelist

Membro desde: 13/09/2007 09:26:21
Mensagens: 415
Localização: Itaperuna -RJ
Offline

ViniGodoy wrote:Chega no catch sim. Você pode não impedir que a VM aborte, mas você pode gravar num arquivo a causa do erro, antes disso.

Mas geralmente, é mais útil registrar o defaultUncaughtExceptionHandler para isso.

Dê uma olhada na classe Thread e no método setDefaultUncaughtExceptionHandler. É o método que é chamado quando um throwable não é capturado por classe nenhuma, antes da VM abortar. É útil para logar eventuais erros e runtimeexceptions num arquivo, antes do programa cair fora.

Existe também o setUncaughtExceptionHandler, que não é estático, caso você queira registrar um handler diferente para uma thread específica.



Vini, mas como eu posso ter garantia de que dependendo do Error, a JVM vai conseguir tratar?? Eu poderia ter um erro que fizesse ela para de forma brusca antes dela chegar no catch??

Att

When you steal from one author, is called plagiarism, when you steal from many is called research.

[WWW] [MSN]
ViniGodoy
Moderador
[Avatar]

Membro desde: 11/12/2006 08:22:01
Mensagens: 20580
Localização: Curitiba/PR
Offline

Realmente, não há garantias, especialmente em erros de JNI, por exemplo.

Mas erros de coisas que estão sobre o controle da VM como OutOfMemory, AWTError, StackOverflowError, ThreadDeath são capturados, o que já aumenta muito o grau de confiabilidade dos seus traces.

É bom lembrar que um OutOfMemory representa falta de memória do programa, não do PC ou da VM. O mesmo vale par ao StackOverflow. Por isso, é relativamente fácil para VM captura-los.

@ViniGodoy - Lattes

Tem dúvidas de Java? Poste no fórum! Não respondo dúvidas de java via MP!

Ponto V! - Desenvolvimento de Jogos Profissional - @Pontov - Facebook
Projeto Towel - Swing de uma forma inteligente (Novo lar do ObjectTableModel e do Auto-Filtro).

Ei... você está usando DefaultTableModel no seu projeto??
Não faça isso! Veja: http://www.guj.com.br/posts/list/15/199067.java#1001295
[WWW]
danielbussade
JavaEvangelist

Membro desde: 13/09/2007 09:26:21
Mensagens: 415
Localização: Itaperuna -RJ
Offline

ViniGodoy wrote:Realmente, não há garantias, especialmente em erros de JNI, por exemplo.

Mas erros de coisas que estão sobre o controle da VM como OutOfMemory, AWTError, StackOverflowError, ThreadDeath são capturados, o que já aumenta muito o grau de confiabilidade dos seus traces.

É bom lembrar que um OutOfMemory representa falta de memória do programa, não do PC ou da VM. O mesmo vale par ao StackOverflow. Por isso, é relativamente fácil para VM captura-los.


Vini, desculpa minha ignorância, mas como memória do "programa", a medida que vou precisando de memória eu vou alocando mais, até chegar a hora que acaba a memória da VM não??

Me explica melhor!


Att

When you steal from one author, is called plagiarism, when you steal from many is called research.

[WWW] [MSN]
ViniGodoy
Moderador
[Avatar]

Membro desde: 11/12/2006 08:22:01
Mensagens: 20580
Localização: Curitiba/PR
Offline

danielbussade wrote:Vini, desculpa minha ignorância, mas como memória do "programa", a medida que vou precisando de memória eu vou alocando mais, até chegar a hora que acaba a memória da VM não??


Até acabar a memória da VM, não do SO. Quando a VM sobe, ela pré aloca um espaço para o heap. Esse espaço é dobrado até atingir o limite máximo, que por padrão é, se eu não me engano, míseros 64MB. Esse é o espaço máximo em que se pode alocar usando new (variáveis locais sem new não contam, já que ficam no stack).

É para isso que serve o parâmetro -Xmx, ele permite que você aumente o tamanho do Heap. Applications servers já tem esse parâmetro configurado para valores bem maiores.

O parâmetro -Xms serve para definir qual é o tamanho inicial que o heap da VM irá ocupar (é por isso que um programa Java já consome um caminhão de memória logo que sobe).

A mesma coisa acontece com o StackOverflowError. Existem outros parâmetros na VM que permitem configurar o tamanho exato dos stacks e, se você tiver um programa muito recursivo (ou que esteja rodando num hardware mais limitado), você pode ajustar esses valores.

Por isso os erros podem ser capturados pela VM, já que ela pode deixar sua aplicação sem recursos, mas ela mesmo não estar sem recursos do SO.

Alguns bons artigos sobre esse assunto:
HotSpot Engine Architecture
HotSpot Ergonomics
HotSpot VM Command Line Options
Java Performance FAQ
Tuning Garbage Collection with the 5.0 Java Virtual Machine
HotSpot Class Data Sharing
Big Heaps and Intimate Shared Memory (ISM)
J2SE 5.0 Performance White Paper

This message was edited 1 time. Last update was at 04/03/2008 08:44:43


@ViniGodoy - Lattes

Tem dúvidas de Java? Poste no fórum! Não respondo dúvidas de java via MP!

Ponto V! - Desenvolvimento de Jogos Profissional - @Pontov - Facebook
Projeto Towel - Swing de uma forma inteligente (Novo lar do ObjectTableModel e do Auto-Filtro).

Ei... você está usando DefaultTableModel no seu projeto??
Não faça isso! Veja: http://www.guj.com.br/posts/list/15/199067.java#1001295
[WWW]
 
Índice dos Fóruns » Java Básico
Ir para:   
Powered by JForum 2.1.8 © JForum Team