Por: Roberto Alexis Farah

 

Pessoal, eis a solução para o Desafio da semana passada: http://blogs.technet.com/latam/archive/2006/05/26/430543.aspx

 

 

SOLUÇÃO

 

A solução que apresento mostra os detalhes da exceção e, acima de tudo, a linha de código fonte que causou a exceção!

Sim, isso mesmo! A linha de código fonte!

Ok... alguns vão dizer que porque trabalho na Microsoft tenho acesso a informação que não é pública... É verdade! J Entretanto para resolver esse desafio uso aqui um comando do Visual Basic que não só é público como é muito antigo! SIM, é uma herança de antigas versões do Visual Basic, trata-se do comando erl.

O comando erl retorna a linha da última instrução executada. Entretanto, para isso é necessário se enumerar as linhas do código fonte.

Até imagino alguns pensando no trabalho que seria fazer isso numa grande aplicação. De fato, portanto, deve haver um modo de automatizarmos isso. Sim, há um modo! Ferramentas freeware ou shareware.

 

Coloco aqui alguns links mas aviso que nunca as utilizei pois utilizo uma versão freeware antiga chamada LineNo que era de um livro de Visual Basic e o link para download não funciona mais. Entretanto, uma busca rápida na internet (usando http://search.msn.com.br J ) vai revelar ainda outras mais:

 

http://www.smtpcomponent.net/categorie/development tools/129.aspx  (shareware)

http://www.databasecreations.com/prod_codetools.htm (shareware mas há uma versão demo)

http://www.mztools.com/v3/mztools3.htm (freeware)

 

Pois bem, eis a solução:

 

Public Sub DivideByZero()
On      Error GoTo HandleError


10      Dim x As Long
20      Dim y As Long
30      y = 5
40      MsgBox y / x 'error

 

Exit Sub
HandleError:
          App.LogEvent "DivideByZero()- Descricao do Erro = " & _
                              Err.Description & _
                             " – Codigo do Erro = " & _
                              CStr(Err.Number) & _
                              " - Fonte = " & _
                             Err.Source & _
                             " – Numero de linha do codigo fonte = " & _
                             CStr(
Erl)
End Sub

 

 

Simples e eficiente! Usei essa abordagem com sucesso várias vezes com meus clientes!

 

Eis artigos que explicam sobre o comando erl:

 

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vblr7/html/valrferlproperty.asp

 

http://support.microsoft.com/kb/243548/en-us

 

http://support.microsoft.com/kb/244264/en-us

 

http://support.microsoft.com/kb/828550/en-us

 

Atente para o fato que essa técnica aumenta muito o tamanho do código binário, portanto, o ideal é usá-la para identificar o erro mas depois remover apenas os números de linhas. Nesse caso o erl vai retornar zero sempre, mas, se necessário, basta se inserir números de linhas novamente.

 

Até o próximo desafio!