Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Dúvida com "sopa" de Exceptions

Olá Niko,tudo bem?

Niko, repara bem esse meu caso de uso, é uma rotina onde eu coleto vários registros escritos em html, junto todos converto em um único arquivo pdf e gero uma cópia assinada com certificado do tipo pfx. Por fazer diversas operações com arquivos,diretórios, certificado, tenho muitos try catch no código principalmente porque o compilador obriga-me tratar por elas serem do tipo checked e ainda tenho exceções decorrentes do próprio negócio. O fluxo é o seguinte, o managed bean chama a classe de serviço,que salva o objeto no reposiório com JPA e dispara um eveto cdi, o evento cdi dispara dois métodos, um para transformar o html em pdf e se conseguiu fazer essa conversão, então ele assina o PDF. Nas classes PDFConverter e AssinadorA1 tenho diversos blocos catch e dai vem a dúvida 1:

Dúvida1: essas exceções são checked e ao meu ver são exceções irrecuperáveis. Neste caso oque é melhor, não fazer nada como está no exemplo e esperar a sorte para que alguém que chamou esse método trate a exceção? ou deveria relançar uma outra exceção? talvez uma exceção customizada por exemplo InfraestruturaException?

Dúvida2: Na minha classe diário Service, trato coisas referentes ao négocio do sistema, então devo tratar ou relaçar exceções do tipo IOException, KeyStoreException,InvalidParameterException aqui nesta classe visto que essas exceptions estão mais relacionados com a camada de infraestrutura? o mais correto aqui seria eu também criar uma exception referente a minhas regras de negócio e junto com a minha exception InfraestruturaException e aplicar throws apenas nas exceptions proprias do meu sistema para que o managed bean tenha que lidar apenas com estas duas exceções?


@Named
@ViewScoped
public class GerenciarDiario implements Serializable{


    public void publicarDiario(){

        try {
                 this.diario = diarioService.publicarEdicaoExtra(diario.getDiarioId(), seguranca.getUsuario());
            messages.info("Diário publicado com sucesso");
        } catch (Exception e) {

            e.printStackTrace();
            messages.error(e.getMessage());
        }

    }



}
@Stateless
public class DiarioService {


@Transactional
public Diario publicar(Diario original) throws Exception{

    if(original.isAberto()){
            throw new RuntimeException("Não é possível publicar diários abertos");
        }
original = diarioRepository.publicar(original);//salva p estado no banco de dados com JPA

        eventoPublicarDiario.fire(original);

        return original;

}


}

public class PublicacaoDiarioEvent {


    public void publicar(@Observes Diario diario){

        PdfConverter converter = new PdfConverter();
        converter.convertToFile(...);

        AssinadorA1 assinador = new AssinadorA1();
        assinador.signA1(...);
    }

}

public class PdfConverter {

    public void convertToFile(String content,String outputPath){

        try {

        //código que transforma texto html em pdf e joga em um diretório    

        } catch (InvalidParameterException e) {        
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }



}
public class AssinadorA1 {


     public void signA1(String src, String dest)  {  

         try {

            // implementação de assinatura digital utilizando certificado A1 e itext
        } catch (UnrecoverableKeyException e) {

            e.printStackTrace();
        } catch (KeyStoreException e) {

            e.printStackTrace();
        } catch (NoSuchProviderException e) {

            e.printStackTrace();
        } catch (NoSuchAlgorithmException e) {

            e.printStackTrace();
        } catch (CertificateException e) {

            e.printStackTrace();
        } catch (FileNotFoundException e) {

            e.printStackTrace();
        } catch (IOException e) {

            e.printStackTrace();
        } catch (DocumentException e) {

            e.printStackTrace();
        }
        }  
}
1 resposta
solução!
  1. Você deve relançar a exceção para que sua classe cliente saiba se a conversão deu certo ou não.

  2. Isso, dado que são exceções por problemas diferentes, crie uma classe genérica diferente para um agrupamento de problemas e o lance para sua classe cliente, que irá tratar e mostrar o erro de forma suave para o usuário.

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software