ORIENTACAO A OBJETOS - CONCEITO
Fox, entendi perfeitamente sua colocação e concordo plenamente.
Eu só tinha lido a sua primeira pergunta. Mas no fim tem outra falando sobre os msgbox nas camadas. Então sobre esta o que você disse está correto.
Todo erro que ocorre num camada de nÃvel mais baixo deve ser repassada para o nÃvel de cima até chegar no GUI. é isso.
Aproveite para implementar um log desses erros num banco de dados, é muito útil para correções posteriores.
Eu só tinha lido a sua primeira pergunta. Mas no fim tem outra falando sobre os msgbox nas camadas. Então sobre esta o que você disse está correto.
Todo erro que ocorre num camada de nÃvel mais baixo deve ser repassada para o nÃvel de cima até chegar no GUI. é isso.
Aproveite para implementar um log desses erros num banco de dados, é muito útil para correções posteriores.
Pessoa, não esqueçam que o que vocês , são simplesmente classes que herdam de de Exception. Evitem tratar exeções pela mensagem. Ao invés disso, criem suas próprias exceptions:
C#
VB.NET
Então, quando vocês fizerem, por exemplo, uma inserção de cliente e a descrição estiver incompatÃvel por algum motivo, lancem essa exception:
C#
Dessa maneira, lançando cada uma das possÃveis exceções fica muito mais fácil de se validar seja o que for. Além disso, as classes de exceção que vocês lançam, podem conter propriedades que podem conter o objeto em que o erro ocorreu, excelente para Log, veja um exemplo:
Com isso, basta serialiar o conteúdo da proprieade [Ô]ClienteComErro[Ô], e você terá os dados que foram usados e pode gravar isso em um log se quiser, ou jogar na tela, ou enviar por e-mail... enfim, tratar como quiser.
C#
[Serializable]
public class DescricaoInvalidaException : Exception
{
public DescricaoInvalidaException() { }
public DescricaoInvalidaException(string message) : base(message) { }
public DescricaoInvalidaException(string message, Exception inner) : base(message, inner) { }
protected DescricaoInvalidaException(
System.Runtime.Serialization.SerializationInfo info,
System.Runtime.Serialization.StreamingContext context)
: base(info, context) { }
}
VB.NET
<Serializable> _
Public Class DescricaoInvalidaException
Inherits Exception
Public Sub New()
End Sub
Public Sub New(message As String)
MyBase.New(message)
End Sub
Public Sub New(message As String, inner As Exception)
MyBase.New(message, inner)
End Sub
Protected Sub New(info As System.Runtime.Serialization.SerializationInfo, context As System.Runtime.Serialization.StreamingContext)
MyBase.New(info, context)
End Sub
End Class
Então, quando vocês fizerem, por exemplo, uma inserção de cliente e a descrição estiver incompatÃvel por algum motivo, lancem essa exception:
C#
//Na GUI
try
{
BLL.InsereCliente(meu_objeto_cliente);
}
catch (DescricaoInvalidaException ex)
{
MessageBox.Show([Ô]A descrição do cliente está inválida: [Ô] + ex.Message);
}
catch (Exception ex)
{
MessageBox.Show([Ô]algum outro erro ocorreu: [Ô] + ex.Message);
}
//Na BLL:
public void InsereCliente(objetoCliente)
{
if (objetoCliente.Descricao.Legth > 60)
throw new DescricaoInvalidaException([Ô]Descrição não pode ter mais de 60 caracteres[Ô]);
try
{
DAO.InsereCliente(objetoCliente);
}
catch (Exception)
{
throw;
}
}
Dessa maneira, lançando cada uma das possÃveis exceções fica muito mais fácil de se validar seja o que for. Além disso, as classes de exceção que vocês lançam, podem conter propriedades que podem conter o objeto em que o erro ocorreu, excelente para Log, veja um exemplo:
[Serializable]
public class DescricaoInvalidaException : Exception
{
public DescricaoInvalidaException() { }
public DescricaoInvalidaException(string message) : base(message) { }
public DescricaoInvalidaException(string message, Exception inner) : base(message, inner) { }
protected DescricaoInvalidaException(
System.Runtime.Serialization.SerializationInfo info,
System.Runtime.Serialization.StreamingContext context)
: base(info, context) { }
public Entidades.Cliente ClienteComErro {get; set;}
}
Com isso, basta serialiar o conteúdo da proprieade [Ô]ClienteComErro[Ô], e você terá os dados que foram usados e pode gravar isso em um log se quiser, ou jogar na tela, ou enviar por e-mail... enfim, tratar como quiser.
Esse tópico estava ficando bem interessante...
Kerplunk, apesar do tempo parado, estou estudando tudo que foi passado aqui. Mas o tempo anda pouco neste último mês, devido alguns problemas aqui no meu serviço. Mas em breve vou postar algumas coisas que já andei modificando aqui.
Eu to meio [Ô]burrão[Ô] no Exception...ainda não entrou na cabeça o jeito que o Kerplunk mencionou como fazer...
Posso fazer Exception no código todo ? Ou somente aonde poderá ocorrer algum erro ?...
Nesse código, uso Exception ou não ?...do jeito que esta o Exception é genérica...
Posso fazer Exception no código todo ? Ou somente aonde poderá ocorrer algum erro ?...
Nesse código, uso Exception ou não ?...do jeito que esta o Exception é genérica...
Citação:Eu to meio [Ô]burrão[Ô] no Exception...ainda não entrou na cabeça o jeito que o Kerplunk mencionou como fazer...
Posso fazer Exception no código todo ? Ou somente aonde poderá ocorrer algum erro ?...
Nesse código, uso Exception ou não ?...do jeito que esta o Exception é genérica...
Você usa exceptions personalizadas aonde elas forem necessárias. Para você ter uma idéia, nesse mesmo form que você postou, crie uma excption assim:
[Serializable]
public class GridVazioException : Exception
{
public GridVazioException() { }
public GridVazioException(string message) : base(message) { }
public GridVazioException(string message, Exception inner) : base(message, inner) { }
protected GridVazioException(
System.Runtime.Serialization.SerializationInfo info,
System.Runtime.Serialization.StreamingContext context)
: base(info, context) { }
}
é só pra exemplificar o uso de exceptions, mas veja no seu código você tem um [Ô]if[Ô] perguntando se o gridview1 contém linhas, vamos adicionar ali, uma condição [Ô]else[Ô] para dispararmos a exception:
if (gridView1.RowCount > 0)
....
else
throw new GridVazioException([Ô]Gridview1 está vazio[Ô]);
Em seguida rode o código e faça com que o gridview1 fique vazio para cairmos na condição do else e depure o código.
Quando cair no [Ô]else[Ô], veja que a exceção será disparada e você vai ser direcionado para o [Ô]catch[Ô] do seu bloco try. Nesse caso, GridVazioException, será tratada como uma exceção genérica, mas é possÃvel ver o tipo de exceção e a mensagem que colocamos ao disparar.
Então para melhor ainda exemplificar, adicione uma outra seção [Ô]catch[Ô]:
try
{
......
}
catch (Exception ex)
{
Funcoes.Trataerro(.......
}
catch (GridVazioException)
{
//aqui fazer o tratamento para um caso de grid vazio
}
Novamente rode o código depurando e faça com que gridview1 esteja vazio. Observe que a exception será disparada no bloco else e você será redirecionado para a seção catch, mas dessa vez, vai cair na exception para o grid vazio, a que adicionamos agora.
Entendendo esse conceito, você pode disparar e capturar exceções bem mais especÃficas e em muitas casos tratar ao invés de simplesmente mostrar o erro. No caso do exemplo, um grid vazio não tem o que ser feito para tratar, mas imagine, por exemplo que o usuário não preencheu um campo obrigatório. Nesse caso, você pode disparar uma exception [Ô]CampoObrigatorioVazioException[Ô] ou coisa assim, e no tratamento da mesma colocar um valor padrão e tentar novamente executar a rotina. As aplicações disso são muitas, basta usar a criatividade. O truque, é não enxergar todo e qualquer erro como fatal, onde simplesmente se mostra o erro e aborta a rotina, tem muita coisa que pode ser tratada, à s vezes de forma automática, à s vezes fazendo uma pergunta ao usuário, mas ainda assim, tratável.
ahhh...agora eu entendi....o que eu estava fazendo era simplesmente mostrar o erro e com isso a aplicação não executava mais a partir desse erro...herança do VB6....heheh
e eu posso criar quantas exceptions for necessária ? não existe limite para isso ?
é ..... muita tecnologia ..... que pena que se usar engenharia reversa do codigo da pra pegar o codigo fonte .... e nem me falem de embaraçador de codigo ... daqui uns 5 anos ... vai existir softwares que vai driblar os softwares criados hoje ...
Citação::
e eu posso criar quantas exceptions for necessária ? não existe limite para isso ?
Não existe limite nenhum, você pode usar quantas exceptions quiser. Veja também que a exception em si, é uma classe e pode ter também métodos e propriedades, usando o mesmo exemplo:
[Serializable]
public class GridVazioException : Exception
{
[txt-color=#e80000] public string NomeDoForm { get; set; }[/txt-color]
public GridVazioException() { }
public GridVazioException(string message) : base(message) { }
public GridVazioException(string message, Exception inner) : base(message, inner) { }
protected GridVazioException(
System.Runtime.Serialization.SerializationInfo info,
System.Runtime.Serialization.StreamingContext context)
: base(info, context) { }
}
Assim, quando for disparar a excpetion, pode usar essa propriedade [Ô]NomeDoForm[Ô] e colocar por exemplo o nome do form, basta usar a imaginação, pode colocar até mesmo uma propriedade que por reflection serializa o objeto que causou a exception, ou qualquer outra coisa que quiser.
Citação::
é ..... muita tecnologia ..... que pena que se usar engenharia reversa do codigo da pra pegar o codigo fonte .... e nem me falem de embaraçador de codigo ... daqui uns 5 anos ... vai existir softwares que vai driblar os softwares criados hoje ...
1 - Usando engenharia reversa, você pega o código, mas se você não entende o conceito, código é pura bobagem
2 - Se você pegar simplesmente o código, pode fazer rodar, mas você não vai saber o que está acontecendo e se precisar de uma manutenção ou quiser mudar algo, vai ter que aprender os conceitos para poder lidar com o código
3 - Se você conhece os conceitos, o código é o de menos. O código nada mais é que conceito aplicado e se você conhece conceito, sabe fazer o código muito bem e por isso não vai precisar e nem querer fazer engenharia reversa.
Pense nisso, você está preso ao paradigma de código e não vai evoluir se não sair dele.
Faça seu login para responder