Qual a exceção mais apropriado pro meu caso, StateException ou ArgumentException?
5 respostas
analyser
Olá, tenho um ambiente onde forneço serviços a cliente que são aplicações externas, e nesses serviços recebo um objeto como parametro que representa uma entidade, e no meu serviço valido se a entidade (argumento), passado como parâmetro é válido, entre essas validações verifico se o estado do objeto é válido tb, pois isso faz parte do contrato.
Agora a dúvida, qual exceção devo lançar para o meu cliente, IllegalArgumentException ou IllegalStateException, já que o argumento que ele me passou é inválido e seu estado tb pode ser.
Use IllegalArgumentException para esse caso. IllegalStateException é utilizada quando um método é chamado em um momento inapropriado.
analyser
Obrigado pelo resposta tnaires, eu vi a um tempo o post do “Shoes”, sobre contratos nulos (http://www.fragmental.com.br/wiki/index.php/Contratos_Nulos), e nele ele utiliza o IllegalStateException, para denotar que o estado do objeto é inválido, não seria esse o caso tb, o estado do objeto que recebi é inválido?
Valew
tnaires
O Shoes usa IllegalStateException para validar o estado do próprio objeto, e não de outro que ele esteja recebendo como argumento de método. Ou seja, sempre que os dados do objeto sofrem alguma modificação, é preciso checar seu estado. Caso ele tenha chegado em um estado inválido, uma IllegalStateException é lançada. Sacou a diferença?
Como exemplo, temos a classe abaixo:
classNumeroNatural{privateintvalor;publicvoidsetValor(intvalor){// Naturais não podem ser menores que zero.if(valor<0){thrownewIllegalArgumentException("Valorinválido");}this.valor=valor;}publicvoidsubtrair(NumeroNaturalb){this.valor-=b.getValor();// O argumento foi válido, mas dependendo do valor o objeto pode chegar a um estado inválido.if(valor<0){thrownewIllegalStateException("Umnúmeronaturalnãopodesermenorquezero.");}}}
Não é responsabilidade do método subtrair() validar o estado do objeto passado como parâmetro.
analyser
Valew tnaires, eu já tinha imaginado essa diferença, mais é que o sentido da exception deixa duvida, e é sempre bom ouvir a opnião dos outros.
valew e abraço
A
andredecotia
<blockquote>//métodopublicvoidsubtrair(TestarIllegalStateb){this.valor-=b.getValor();//o argumento foi válido, mas dependendo do valor o objeto pode chegar//a um estado inválido.if(valor<0){thrownewIllegalStateException(“Umnúmeronaturalnãopodesermenorquezero.”);}}</blockquote>
não entendí essa parte… tou tentando gerar essa exceções…