<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogs.technet.com/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Desafio da Semana #5</title><link>http://blogs.technet.com/b/latam/archive/2006/05/26/desafio-da-semana-5.aspx</link><description>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</description><dc:language>en-US</dc:language><generator>Telligent Evolution Platform Developer Build (Build: 5.6.50428.7875)</generator><item><title>re: Desafio da semana #5</title><link>http://blogs.technet.com/b/latam/archive/2006/05/26/desafio-da-semana-5.aspx#439473</link><pubDate>Fri, 30 Jun 2006 05:51:47 GMT</pubDate><guid isPermaLink="false">d5e57398-b9ef-4490-9955-07cbb4e4a80d:439473</guid><dc:creator>Waldemas</dc:creator><description>Ol&amp;#225; para todos, &lt;br&gt;&lt;br&gt;Achei bem interessante o mecanismo apresentado, bem aplic&amp;#225;vel para o ambiente VB6 e esse tipo de situa&amp;#231;&amp;#227;o.&lt;br&gt;&lt;br&gt;E como curiosidade, para solu&amp;#231;&amp;#245;es em .NET, segue um artigo bem interessante sobre o tratamento de exceptions:&lt;br&gt;&lt;br&gt;&lt;a rel="nofollow" target="_new" href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnbda/html/exceptdotnet.asp"&gt;http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnbda/html/exceptdotnet.asp&lt;/a&gt;&lt;br&gt;&lt;br&gt;Uma leitura valiosa.&lt;br&gt;&lt;br&gt;Abra&amp;#231;os!&lt;br&gt;&lt;br&gt;Waldemas...&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.technet.com/aggbug.aspx?PostID=439473" width="1" height="1"&gt;</description></item><item><title>re: Desafio da semana #5</title><link>http://blogs.technet.com/b/latam/archive/2006/05/26/desafio-da-semana-5.aspx#434551</link><pubDate>Fri, 09 Jun 2006 20:30:31 GMT</pubDate><guid isPermaLink="false">d5e57398-b9ef-4490-9955-07cbb4e4a80d:434551</guid><dc:creator>Roberto Farah</dc:creator><description>Ol&amp;#225; Danilo,&lt;br&gt;Parab&amp;#233;ns pela resposta! Absolutamente correta!&lt;br&gt;O legal dessa solu&amp;#231;&amp;#227;o &amp;#233; que ela se baseia em um comando antigo do Visual Basic e, por isso, pouco utilizado.&lt;br&gt;Obrigado pela participa&amp;#231;&amp;#227;o! :)&lt;br&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.technet.com/aggbug.aspx?PostID=434551" width="1" height="1"&gt;</description></item><item><title>re: Desafio da semana #5</title><link>http://blogs.technet.com/b/latam/archive/2006/05/26/desafio-da-semana-5.aspx#433914</link><pubDate>Thu, 08 Jun 2006 07:27:56 GMT</pubDate><guid isPermaLink="false">d5e57398-b9ef-4490-9955-07cbb4e4a80d:433914</guid><dc:creator>Danilo Pimentel</dc:creator><description>Ol&amp;#225; amigos,&lt;br&gt;&lt;br&gt;Mais uma vez um assunto excelente para ser abordado aqui nesse blog.&lt;br&gt;&lt;br&gt;Inicialmente precisamos nos preocupar em certificarmos que todas as rotinas tem tratamento adequado de erro. Contudo apenas isso n&amp;#227;o &amp;#233; suficiente, imagine um m&amp;#233;todo um pouco mais extenso que o apresentado, mesmo com um tratamento de erros regular n&amp;#227;o ser&amp;#237;amos capazes de identificarmos exatamente qual comando dentre tantos presentes nesse m&amp;#233;todo que possa ter gerado o problema. A mina sugest&amp;#227;o &amp;#233; a utiliza&amp;#231;&amp;#227;o de uma t&amp;#233;cnica bastante antiga do Basic que fora tamb&amp;#233;m encorporada ao Visual Basic, que &amp;#233; a numera&amp;#231;&amp;#227;o de c&amp;#243;digo.&lt;br&gt;&lt;br&gt;A enumera&amp;#231;&amp;#227;o de c&amp;#243;digo &amp;#233; um antigo recurso do basic que era muito utilizado como marcador, podendo-se utiliz&amp;#225;-la para defini&amp;#231;&amp;#227;o de labels, como no exemplo abaixo:&lt;br&gt;&lt;br&gt;Private Function Contador(ByVal Qt As Integer) As Long&lt;br&gt;1 Dim RetVal As Long&lt;br&gt;2&lt;br&gt;3 If Qt &amp;gt; 0 Then&lt;br&gt;4 &amp;nbsp;RetVal = RetVal + 1&lt;br&gt;5 &amp;nbsp;Qt = Qt - 1&lt;br&gt;6 &amp;nbsp;Goto 3 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 'move cursor de execu&amp;#231;&amp;#227;o para linha 3&lt;br&gt;7 End If&lt;br&gt;8 Contador = RetVal&lt;br&gt;End Function&lt;br&gt;&lt;br&gt;Claro que o exemplo acima, serve apenas para demonstra&amp;#231;&amp;#227;o de labels por numera&amp;#231;&amp;#227;o, mas n&amp;#227;o &amp;#233; uma forma das mais elegantes de se escrever...&lt;br&gt;&lt;br&gt;O recurso de enumera&amp;#231;&amp;#227;o tamb&amp;#233;m pode ser utilizado para resolver o problema de melhor detec&amp;#231;&amp;#227;o de erros, da seguinte maneira:&lt;br&gt;&lt;br&gt;Public Sub DivideByZero()&lt;br&gt;1 &amp;nbsp;Dim x As Long&lt;br&gt;2 &amp;nbsp;Dim y As Long&lt;br&gt;3 &amp;nbsp;On Error GoTo DeuErro&lt;br&gt;4 &amp;nbsp;y = 5&lt;br&gt;5 &amp;nbsp;MsgBox y / x 'error&lt;br&gt;6 &amp;nbsp;Exit Sub&lt;br&gt;7 DeuErro:&lt;br&gt;8 &amp;nbsp;MsgBox &amp;quot;Ocorreu um erro na execu&amp;#231;&amp;#227;o&amp;quot; + vbCrLf + vbCrLf + &amp;quot;N&amp;#250;mero: &amp;quot; + CStr(Err) + vbCrLf + &amp;quot;Descri&amp;#231;&amp;#227;o: &amp;quot; + Error$ + vbCrLf + &amp;quot;Linha: &amp;quot; + CStr(Erl), vbCritical&lt;br&gt;End Sub&lt;br&gt;&lt;br&gt;Note que, ocorrido um erro, o programa ir&amp;#225; mostrar detalhadamente qual o n&amp;#250;mero do erro, sua descri&amp;#231;&amp;#227;o e ainda a linha que gerou o problema.&lt;br&gt;&lt;br&gt;O uso de enumera&amp;#231;&amp;#227;o &amp;#233; uma boa pr&amp;#225;tica para localiza&amp;#231;&amp;#227;o de problemas. Contudo, &amp;#233; bastante evidente que o c&amp;#243;digo n&amp;#227;o fica nada agrad&amp;#225;vel... &amp;#201; muito trabalhoso codificar e se preocupar simultaneamente com enumera&amp;#231;&amp;#227;o. Desenvolvi portanto um programa que faz de forma autom&amp;#225;tica a enumera&amp;#231;&amp;#227;o de meu c&amp;#243;digo antes que eu gere uma release do produto. Assim sempre guardo c&amp;#243;pia enumerada do c&amp;#243;digo referente a cada release para poder numa situa&amp;#231;&amp;#227;o de erro, ter maiores detalhes quanto sua ocorr&amp;#234;ncia.&lt;br&gt;&lt;br&gt;Acredito que deve existir uma s&amp;#233;rie de outros programas que fazem tamb&amp;#233;m enumera&amp;#231;&amp;#227;o do c&amp;#243;digo basic.&lt;br&gt;&lt;br&gt;Para escrita no Event Viewer conforme sugerido no desafio podemos fazer utilizando comandos internos do Visual Basic ou diretamente por API, para utiliza&amp;#231;ao pelo Visual Basic utilizar&amp;#237;amos:&lt;br&gt;&lt;br&gt;App.LogEvent &amp;quot;Ocorreu um erro na execu&amp;#231;&amp;#227;o&amp;quot; + vbCrLf + vbCrLf + &amp;quot;N&amp;#250;mero: &amp;quot; + CStr(Err) + vbCrLf + &amp;quot;Descri&amp;#231;&amp;#227;o: &amp;quot; + Error$ + vbCrLf + &amp;quot;Linha: &amp;quot; + CStr(Erl), 1&lt;br&gt;&lt;br&gt;Mas h&amp;#225; uma forma um pouco mais rebuscada que seria utilizando-se a api:&lt;br&gt;&lt;br&gt;Private Declare Function ReportEvent &lt;br&gt;Lib &amp;quot;advapi32&amp;quot; Alias &amp;quot;ReportEventA&amp;quot; (ByVal hEventLog As Long, ByVal wType As Long, ByVal wCategory As Long, ByVal dwEventID As Long, &lt;br&gt;ByVal lpUserSid As Long, ByVal wNumStrings As Long, ByVal dwDataSize As Long, lpStrings As Any, lpRawData As Any) As Long&lt;br&gt;&lt;br&gt;Com a ReportEventA temos como detalhar um pouco mais o evento gerado.&lt;br&gt;&lt;br&gt;At&amp;#233; a pr&amp;#243;xima.&lt;br&gt;&lt;br&gt;Abra&amp;#231;os&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.technet.com/aggbug.aspx?PostID=433914" width="1" height="1"&gt;</description></item><item><title>re: Desafio da semana #5</title><link>http://blogs.technet.com/b/latam/archive/2006/05/26/desafio-da-semana-5.aspx#431946</link><pubDate>Fri, 02 Jun 2006 19:01:15 GMT</pubDate><guid isPermaLink="false">d5e57398-b9ef-4490-9955-07cbb4e4a80d:431946</guid><dc:creator>Roberto Farah</dc:creator><description>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. :)&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.technet.com/aggbug.aspx?PostID=431946" width="1" height="1"&gt;</description></item></channel></rss>