• Sign in
 

LATAM Team blog

Search Blogs
Tags
  • Cloud
  • Cluster
  • Crash
  • Desarrollo
  • Desenvolvimento
  • Directory Services
  • DST
  • Español
  • Exchange/Outlook
  • Hang
  • High Availability
  • IIS
  • Networking
  • Office
  • People
  • Performance
  • Português
  • PowerShell Scripts
  • Security
  • Setup
  • Sharepoint
  • SQL
  • Virtualization
  • Windbg Scripts
  • Windows
Blog - News

Where Are You Coming From Today?

Where are you now?

Follow us on:

Options
  • Blog Home
  • About
  • Share this
  • RSS for posts
  • Atom
  • RSS for comments
Archive
Archives
  • May 2013 (4)
  • April 2013 (5)
  • March 2013 (6)
  • February 2013 (3)
  • January 2013 (3)
  • December 2012 (2)
  • November 2012 (1)
  • October 2012 (4)
  • September 2012 (5)
  • August 2012 (2)
  • July 2012 (2)
  • June 2012 (3)
  • May 2012 (13)
  • April 2012 (6)
  • March 2012 (6)
  • February 2012 (4)
  • January 2012 (7)
  • December 2011 (11)
  • October 2011 (6)
  • September 2011 (1)
  • August 2011 (3)
  • July 2011 (7)
  • June 2011 (6)
  • May 2011 (5)
  • April 2011 (2)
  • March 2011 (13)
  • February 2011 (1)
  • January 2011 (5)
  • December 2010 (6)
  • November 2010 (1)
  • October 2010 (6)
  • September 2010 (2)
  • August 2010 (3)
  • July 2010 (3)
  • June 2010 (5)
  • May 2010 (1)
  • April 2010 (10)
  • March 2010 (21)
  • February 2010 (8)
  • January 2010 (3)
  • December 2009 (5)
  • November 2009 (5)
  • October 2009 (6)
  • September 2009 (8)
  • August 2009 (9)
  • July 2009 (1)
  • June 2009 (3)
  • May 2009 (2)
  • April 2009 (7)
  • March 2009 (4)
  • February 2009 (7)
  • January 2009 (7)
  • December 2008 (8)
  • November 2008 (7)
  • October 2008 (22)
  • September 2008 (17)
  • August 2008 (13)
  • July 2008 (11)
  • June 2008 (7)
  • May 2008 (3)
  • April 2008 (2)
  • March 2008 (6)
  • January 2008 (4)
  • December 2007 (9)
  • November 2007 (4)
  • October 2007 (3)
  • September 2007 (8)
  • August 2007 (4)
  • July 2007 (2)
  • June 2007 (5)
  • May 2007 (7)
  • April 2007 (9)
  • March 2007 (7)
  • February 2007 (6)
  • January 2007 (4)
  • December 2006 (14)
  • November 2006 (10)
  • October 2006 (10)
  • September 2006 (11)
  • August 2006 (15)
  • July 2006 (7)
  • June 2006 (14)
  • May 2006 (22)
  • April 2006 (16)
  • March 2006 (20)
  • January 2006 (1)

Desafio da Semana #5

TechNet Blogs > LATAM Team blog > Desafio da Semana #5

Desafio da Semana #5

LatamBlog
26 May 2006 4:25 PM
  • Comments 4

 

Desafio da semana #5

 

 

Por: Roberto Alexis Farah

 

Oi pessoal!

Eis o novo desafio, simples, mas muito interessante.

 

CENÁRIO

 

Imagine uma situação típica: você foi o desenvolvedor designado para identificar onde um componente Visual Basic 6 rodando no COM+ está lançando uma exceção fatal e derrubando o processo.

Você precisa obter mais detalhes dessa exceção de modo a achar o real problema. Você faz idéia do método que esteja lançando a exceção.

 

Para simplificar, imagine que a solução proposta deverá servir para o pequeno método abaixo ou para um complexo e grande método. O código abaixo mostra claramente o ponto onde ocorre a exceção, sem corrigir o código você deve usar um mecanismo para obter mais detalhes da exceção e, preferivelmente, salvar isso em algum lugar, como Event Viewer.

 

Public Sub DivideByZero()
     Dim x As Long
     Dim y As Long


     y = 5
     MsgBox y / x 'error
End Sub

 

 

SINTOMA

 

Crash em componente rodando no COM+.

 

OBJETIVO

 

O PROBLEMA é bastante óbvio no exemplo acima, uma divisão por zero, entretanto, o que interessa nesse desafio é propor uma SOLUÇÃO que você possa aplicar em outros métodos, seja de uma aplicação executável, DLL ou componente rodando no COM+, desde que feitos com Visual Basic 6.

A solução deve consistir de:

 

- Salvar os detalhes da exceção e informações relevantes no Event Viewer de modo que ao analisar o Event Viewer seja fácil se saber de onde a exceção é lançada e os detalhes sobre a mesma.

 

 

 

Nota: Sim, é fácil, mas há um macete que torna a solução muito melhor e não é algo muito conhecido! ;)

 

Semana que vem apresento a resposta.

 

Boa semana a todos!

 

  • 4 Comments
Desenvolvimento
Comments
Comments
  • Roberto Farah
    2 Jun 2006 12:01 PM
    Pessoal, como nenhum post foi colocado, deixarei uma semana mais antes de publicar a resposta e colocar um novo desafio. Enquanto isso, estarei publicando um artigo ainda hoje. Fiquem de olho. :)
  • Danilo Pimentel
    8 Jun 2006 12:27 AM
    Olá amigos,

    Mais uma vez um assunto excelente para ser abordado aqui nesse blog.

    Inicialmente precisamos nos preocupar em certificarmos que todas as rotinas tem tratamento adequado de erro. Contudo apenas isso não é suficiente, imagine um método um pouco mais extenso que o apresentado, mesmo com um tratamento de erros regular não seríamos capazes de identificarmos exatamente qual comando dentre tantos presentes nesse método que possa ter gerado o problema. A mina sugestão é a utilização de uma técnica bastante antiga do Basic que fora também encorporada ao Visual Basic, que é a numeração de código.

    A enumeração de código é um antigo recurso do basic que era muito utilizado como marcador, podendo-se utilizá-la para definição de labels, como no exemplo abaixo:

    Private Function Contador(ByVal Qt As Integer) As Long
    1 Dim RetVal As Long
    2
    3 If Qt > 0 Then
    4  RetVal = RetVal + 1
    5  Qt = Qt - 1
    6  Goto 3             'move cursor de execução para linha 3
    7 End If
    8 Contador = RetVal
    End Function

    Claro que o exemplo acima, serve apenas para demonstração de labels por numeração, mas não é uma forma das mais elegantes de se escrever...

    O recurso de enumeração também pode ser utilizado para resolver o problema de melhor detecção de erros, da seguinte maneira:

    Public Sub DivideByZero()
    1  Dim x As Long
    2  Dim y As Long
    3  On Error GoTo DeuErro
    4  y = 5
    5  MsgBox y / x 'error
    6  Exit Sub
    7 DeuErro:
    8  MsgBox "Ocorreu um erro na execução" + vbCrLf + vbCrLf + "Número: " + CStr(Err) + vbCrLf + "Descrição: " + Error$ + vbCrLf + "Linha: " + CStr(Erl), vbCritical
    End Sub

    Note que, ocorrido um erro, o programa irá mostrar detalhadamente qual o número do erro, sua descrição e ainda a linha que gerou o problema.

    O uso de enumeração é uma boa prática para localização de problemas. Contudo, é bastante evidente que o código não fica nada agradável... É muito trabalhoso codificar e se preocupar simultaneamente com enumeração. Desenvolvi portanto um programa que faz de forma automática a enumeração de meu código antes que eu gere uma release do produto. Assim sempre guardo cópia enumerada do código referente a cada release para poder numa situação de erro, ter maiores detalhes quanto sua ocorrência.

    Acredito que deve existir uma série de outros programas que fazem também enumeração do código basic.

    Para escrita no Event Viewer conforme sugerido no desafio podemos fazer utilizando comandos internos do Visual Basic ou diretamente por API, para utilizaçao pelo Visual Basic utilizaríamos:

    App.LogEvent "Ocorreu um erro na execução" + vbCrLf + vbCrLf + "Número: " + CStr(Err) + vbCrLf + "Descrição: " + Error$ + vbCrLf + "Linha: " + CStr(Erl), 1

    Mas há uma forma um pouco mais rebuscada que seria utilizando-se a api:

    Private Declare Function ReportEvent
    Lib "advapi32" Alias "ReportEventA" (ByVal hEventLog As Long, ByVal wType As Long, ByVal wCategory As Long, ByVal dwEventID As Long,
    ByVal lpUserSid As Long, ByVal wNumStrings As Long, ByVal dwDataSize As Long, lpStrings As Any, lpRawData As Any) As Long

    Com a ReportEventA temos como detalhar um pouco mais o evento gerado.

    Até a próxima.

    Abraços
  • Roberto Farah
    9 Jun 2006 1:30 PM
    Olá Danilo,
    Parabéns pela resposta! Absolutamente correta!
    O legal dessa solução é que ela se baseia em um comando antigo do Visual Basic e, por isso, pouco utilizado.
    Obrigado pela participação! :)
  • Waldemas
    29 Jun 2006 10:51 PM
    Olá para todos,

    Achei bem interessante o mecanismo apresentado, bem aplicável para o ambiente VB6 e esse tipo de situação.

    E como curiosidade, para soluções em .NET, segue um artigo bem interessante sobre o tratamento de exceptions:

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

    Uma leitura valiosa.

    Abraços!

    Waldemas...
Page 1 of 1 (4 items)
  • © 2013 Microsoft Corporation.
  • Terms of Use
  • Trademarks
  • Privacy & Cookies
  • 5.6.426.415
  • TechNet
  • Products
  • IT Resources
  • Downloads
  • Training
  • Support
Products
  • Windows
  • Windows
    Server
  • System
    Center
  • Internet
    Explorer
 
  • Office
  • Office 365
  • Exchange
    Server
 
  • SQL Server
  • SharePoint
    Products
  • Lync
  • See all products »
Resources
  • Evaluation Center
  • Learning Resources
  • Microsoft IT Camps
  • Microsoft Technical Communities
  • Microsoft Virtual Academy
  • Script Center
  • Server and Tools Blogs
  • Solution Accelerators
  • TechNet Blogs
 
  • TechNet Flash Newsletter
  • TechNet Gallery
  • TechNet Library
  • TechNet Magazine
  • TechNet Subscriptions
  • TechNet Video
  • TechNet Wiki
  • Windows Sysinternals
  • Virtual Labs
Solutions
  • Networking
  • Cloud and Datacenter
  • Security
  • Virtualization
Updates
  • Service Packs
  • Security Bulletins
  • Microsoft Update
Trials
  • Windows Server 2012
  • System Center 2012 SP1
  • Microsoft SQL Server 2012 SP1
  • Windows 8 Enterprise
  • See all trials »
Related Sites
  • Microsoft Download Center
  • TechNet Evaluation Center
  • Drivers
  • Compatability & Converters
  • Windows Sysinternals
  • TechNet Gallery
Training
  • Training Catalog
  • Class Locator
  • Microsoft Virtual Academy
  • Free Windows Server 2012 courses
  • Free Windows 8 courses
  • SQL Server training
  • e-Learning overview
Certifications
  • Certification overview
  • MCSA: Windows 8
  • Windows Server Certification (MCSE)
  • Private Cloud Certification (MCSE)
  • SQL Server Certification (MCSE)
Other resources
  • TechNet Events
  • Second shot for certification
  • Born To Learn blog
  • IT Camps
Support by product
  • Exchange Server
  • Forefront Server
  • Forefront Edge Security
  • Forefront Server Security
  • Internet Explorer
  • Office
  • SharePoint
 
  • SQL Server
  • System Center
  • Windows Server
  • Windows XP
  • Windows Vista
  • Windows 7
  • Windows 8
Other support links
  • Microsoft Premier Online
  • Microsoft Fix It Center
  • TechNet Forums
  • MSDN Forums
  • Security Bulletins & Advisories
  • International support solutions
  • Log a support ticket
  • Look up event IDs and error codes
Not an IT pro?
  • Microsoft Customer Support
  • Microsoft Community Forums