Solucionado (ver solução)
Solucionado
(ver solução)
4
respostas

[Dúvida] Tenho uma duvida sobre hierarquia das Exceptions

Olá, tudo bem ? Dado esses trechos de código abaixo , me explique por que só tendo o throw new ErroDeConversaoDeAnoException() não faz com que estoure o erro, mas apenas quando chamo no catch?

Minha classe Titulo:

public Titulo(TituloOmdb meuTituloOmdb) {
        this.nome = meuTituloOmdb.title();
        if(meuTituloOmdb.year().length() > 4) {
            throw new ErroDeConversaoDeAnoException("Não consegui converter o ano" +
                    "por que tem mais de 04 caracter");
        }
        this.anoDeLancamento = Integer.valueOf(meuTituloOmdb.year());
        this.duracaoEmMinutos = Integer.valueOf(meuTituloOmdb.runtime().substring(0,2));
    }

Minha Classe Main:

codigos aqui ...
}catch (ErroDeConversaoDeAnoException e ) {
            System.out.println(e.getMessage());
        }
4 respostas

Oie Natália! Tudo certinho?

Na verdade, todas as vezes em que você utiliza o throw, você está sim fazendo com que um erro estoure. O que "segura" esse erro antes de estourar é o catch. O fluxo do programa é: toda vez que uma exceção é lançada dentro de um bloco try, procurar por algum lugar que realmente capture a exceção daquele tipo. Esse lugar é o bloco do catch, e nele podemos fazer várias coisas, inclusive mostrar porque aconteceu essa exceção, usando o método message.

Nesse exemplo de código, a execução entra dentro do if e lança uma exceção do tipo ErroDeConversaoDeAnoException, com mensagem "Não consegui converter o ano por que tem mais de 04 caracter". Como a criação de um Titulo lá no método main estava dentro de um bloco try, o compilador Java busca por um catch que capture uma exceção do tipo ErroDeConversaoDeAnoException. Ele encontra. Ao encontrar, a ação que se faz é imprimir o motivo da exceção.

Se você não usasse o try-catch, a exceção seria lançada automaticamente quando você chamasse o throw, ao invés de continuar a execução, aparecendo só uma pilha de erros no terminal. Sugiro que você tente executar um programa dessa forma pra visualizar as diferenças.

Espero ter ajudado! Qualquer dúvida, estou à disposição!

Abraços e bons estudos! :)

Eu entedi que quando usamos throw ele lança o erro na pilha de execução, mas por exemplo nesse codigo :

public  Department returnDepartment(String id) {
        Department department  = departmentRepository.findById(id)
                .orElseThrow(() ->  new HttpClientErrorException(HttpStatus.NOT_FOUND));
        return  department;
    }
}

Service

public  User createUser(UserDto userDto){
       
            Department  department = this.foundDepartment(userDto.getDepartment());
            User user = UserMapper.userDtoToUSer(userDto, department);
            userRepository.save(user);

        
        return user;
    }

controller

 @PostMapping
    public User addUser(@RequestBody UserDto userDto) {

         return   userService.createUser(userDto);
    }

Sei que o erro estourou, porém no Postman esta com status 200 OK, Por que não aparece no Postman o erro ? Se eu uso try e catch na Controller so aparece no terminal para mim e no Postman continua 200 OK

solução!

Natália boa noite tudo bem? para esses casos, tratamos os erros com os execptionsHanlders da vida, da uma pesquisada de como implementar no seu projeto se vc quiser...

https://www.baeldung.com/exception-handling-for-rest-with-spring

com isso implementado vc consegue tratar os erros que vão estorar, e manipular a saida deles, seja via postman, angular, reaclt... Ou seja qualquer client rodando por trás.

Ah eu entrei no site e conseguir lançar a exceção pro client , muita obrigada pela atenção.