Olá pessoal do GUJ! 
Como prometido, passei esses últimos três dias estudando Exception para tentar chegar a melhor solução cabível no código-exemplo que estamos criando.
Tentei ao máximo possível seguir os conselhos do fantomas e André Fonseca para implementar as Exception. Importante também o artigo deste mês da revista MundoJava no aprendizado. :thumbup:
Vamos ao código-exemplo, que sofreu muita mudança dos últimos exemplos postados, aplicando a nova abordagem (desacoplamento entre visão <-> controle) e o uso de Exception’s.
CLASSES PARA TRATAR EXCEÇÃO:
Superclasse:
public class CadastraException extends Exception {
private String msg;
public CadastraException(String msg) {
super(msg);
this.msg = msg;
}
public String getMessage() {
return msg;
}
}
Subclasse:
public class CPFException extends CadastraException {
public CPFException() {
super("CPF Inválido");
}
}
CLASSES DO MVC:
No BEAN CLIENTE (modelo), nada mudou.
Controle:
public class ClienteControl {
private Cliente cli = null;
ClienteControl(Cliente cli) {
this.cli = cli;
}
public void executar(String nome, String cpf) throws Exception {
try {
if(!Util.validaCPF(cpf))
throw new CPFException();
cli.setCPF(cpf);
cli.setNome(nome);
}
catch(Exception e) {
throw e;
}
}
}
*OBS: Util.validaCPF(cpf) retorna valor booleano!
Visão:
public class ClienteView extends JPanel {
private ClienteControl controller = null;
private JButton btnCadastrar;
private JTextField nome;
private JTextField cpf;
private JLabel lblCad;
public ClienteView(ClienteControl controller) {
this.controller = controller;
this.initialize();
}
private void initialize() {
nome = new JTextField(10);
add(nome);
cpf = new JTextField(10);
add(cpf);
btnCadastrar = new JButton("Cadastrar");
btnCadastrar.addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent e) {
ClienteView.this.executar();
}
});
add(btnCadastrar);
lblCad = new JLabel();
add(lblCad);
}
private void executar() {
try {
this.controller.executar(nome.getText(), cpf.getText());
lblCad.setText("Cadastro realizado com sucesso");
}
catch (CadastraException e) {
lblCad.setText(e.getMessage());
}
catch (Exception e) {
lblCad.setText("Problemas ao cadastrar. Tente novamente!");
}
}
}
main:
public class Cadastro extends JFrame{
Cadastro() {
Cliente cli = new Cliente();
ClienteControl con = new ClienteControl(cli);
ClienteView cv = new ClienteView(con);
add(cv);
setVisible(true);
}
public static void main (String args[]) {
Cadastro cadastrar = new Cadastro();
}
}
Reparem que a visão finalmente está (na minha humilde opinião de aprendiz) muito bem desacoplada do controle. O código do controle está mais legível também. 
Bem, a minha primeira dúvida com esse novo código é a seguinte: b A hierarquia das classes que compõe as Exception está correta?[/b] (Veja a imagem em anexo!)
Repare que criei uma superclasse CadastraException que é herdada pelas subclasses necessárias para avisar sobre exceções de validações que possam ocorrer durante o cadastro do cliente. Também não descartei a opção de tratar demais exceções que possam ocorrer, como conexão com BD, rede, etc… Repare na visão que se a exceção for de validação ela diz onde ocorreu o erro (qual dado de qual campo gerou uma Exception) e se a exceção for de outro tipo (não conhecido até este momento) só informa com uma mensagem que “ocorreu um problema se possível tente novamente”! (Veja o método [color=blue]executar() na linha 31[/color] do ClienteView). Na imagem exemplo coloquei até uma classe CEPException e OutraException para mostrar a hierarquia. Está correto o procedimento?
O que mais preocupa-me nessa situação é que a mensagem da exceção está sendo tratada fora da visão, o que vai contra o que o fantomas me ensinou em uma postagem anterior quando explicou “que é para deixar detalhes da View dentro da View”. :shock:
A minha segunda dúvida é a seguinte: b A Util.validaCPF(cpf) retorna um valor booleano para o controle que caso seja “false” lança uma CPFException (cria e lança no controle). Eu poderia fazer a Util.validaCPF(cpf) criar e lançar a CPFException() ao invés de retornar um boolean?[/b] Ou seja, aquilo que o André Fonseca propos em uma postagem anterior. (Veja linhas [color=blue]11 e 12[/color] do ClienteControl!)
[color=red]Pessoal[/color], VALE PARA TODOS, não deixem de opinar. Sua opinião/sugestão/crítica é muito importante para manter o tópico vivo e contribuir com todos os companheiros do GUJ! 
Se você acredita que algo deve mudar no código-exemplo também não deixe de postar. :idea: E não deixe de selecionar a opção para acompanhar o tópico. Talvés nesse momento não possa ajudar, mas pode surgir uma dúvida que você poderá contribuir!
[size=16][color=green]OBRIGADO GUJ[/color] por proporcionar essa comunidade linda![/size] :arrow: O Brasil inteiro ganha com isso!
Fico no aguardo por novas respostas. Assim que estiver com essas questões solucionadas lançarei nova pergunta para não embolar muitas perguntas com muitas respostas e acabar ficando uma coisa sem começo nem fim, sem lógica entre pergunta e resposta!
Um abraço especial aí para o fantomas, futuro moderador do GUJ, :lol: ele merece!
