Jump to content
Belini

Gravar o número da linha que deu erro.

Recommended Posts

Queria saber onde é chamada a função que mostra uma MsgBox() quando há erros críticos no script e com isto gravar um log com o número da linha onde ocorreu o erro, alguém sabe dizer onde posso colocar a função prá gerar o log?

 

Exemplo de script que dá erro crítico:

#include <File.au3>
$lista = _FileListToArray(@ScriptDir, "*.fake"); procura uma extensão que não existe
MsgBox(4096, "Mensagem!", $lista[1], 3); vai dar erro nesta linha

Error_mensage.JPG

Share this post


Link to post
Share on other sites

@Belini, eu faço assim...

Sempre depois da função, eu escrevo um "If @error Then"

Logicamente, isso não adianta nada se a minha função não está preparada para retornar um SetError(a, b, c) caso ocorra um erro...

 

O legal do _DebutSetup é que você pode configurar o tipo de saída: ConsoleWrite, escrever em LOG, MsgBox.

Com um código só, você pode mudar a necessidade de saída somente no _DebugSetup, e não meche em mais nada no resto do código.

#include <Debug.au3>
Global $LOG = "error.log"
_DebugSetup("verificar", False, 4, $LOG, True)

Local $var = verificar()
If @error Then
	_DebugOut("@error[ " & @error & " ]")
Else
	_DebugOut("@ok   [ " & $var & " ]")
EndIf

Func verificar()
	If Random(0, 1, 1) Then Return SetError(1, 0, 0)
	Return Random(0, 10, 1)
EndFunc   ;==>verificar
Edited by Luigi

Share this post


Link to post
Share on other sites

@Luigi eu faço da forma que vc falou em todas funções de arrays mas em muitas outras funções não dá prá usar o @error e se eu descobrir onde esta MsgBox é gerada não precisarei incluir mais nada no código também pois quando ela aparecer irá gravar um log indicando qual linha deu erro!

Edited by Belini

Share this post


Link to post
Share on other sites

 

Queria saber onde é chamada a função que mostra uma MsgBox() quando há erros críticos no script e com isto gravar um log com o número da linha onde ocorreu o erro, alguém sabe dizer onde posso colocar a função prá gerar o log?

 

Exemplo de script que dá erro crítico:

#include <File.au3>
$lista = _FileListToArray(@ScriptDir, "*.fake"); procura uma extensão que não existe
MsgBox(4096, "Mensagem!", $lista[1], 3); vai dar erro nesta linha

 

Belini,

 

Use essa função que serve para descrever algumas informações do seu erro. Inclusive a linha.

 

;;;; aqui você declara suas bibliotecas
$oMyError = ObjEvent("AutoIt.Error","MyErrFunc")


;;;; aqui fica seu script


;;;; no final coloque essa função
Func MyErrFunc()


    Msgbox(0,"AutoItCOM Test","We intercepted a COM Error !"   & @CRLF  & @CRLF & _
"err.description is: " & @TAB & $oMyError.description & @CRLF & _
"err.windescription:"  & @TAB & $oMyError.windescription & @CRLF & _
"err.number is: "  & @TAB & hex($oMyError.number,8)  & @CRLF & _
"err.lastdllerror is: "   & @TAB & $oMyError.lastdllerror   & @CRLF & _
"err.scriptline is: "  & @TAB & $oMyError.scriptline  & @CRLF & _
"err.source is: "  & @TAB & $oMyError.source  & @CRLF & _
"err.helpfile is: "    & @TAB & $oMyError.helpfile    & @CRLF & _
"err.helpcontext is: " & @TAB & $oMyError.helpcontext _
)


Local $err = $oMyError.number
If $err = 0 Then $err = -1


SetError($err) ; to check for after this function returns
Endfunc

Share this post


Link to post
Share on other sites

@Israel usando o exemplo de erro do meu primeiro não funcionou! Quais seriam as bibliotecas que devo colocar no início do script?

Share this post


Link to post
Share on other sites

@Israel usando o exemplo de erro do meu primeiro não funcionou! Quais seriam as bibliotecas que devo colocar no início do script?

 

 

Suas bibliotecas comum.

 

Adicione essa linha no ínicio do seu script.

  1. $oMyError = ObjEvent("AutoIt.Error","MyErrFunc")
Adicione essa função no final do seu script.
  1. Func MyErrFunc()
  2. Msgbox(0,"AutoItCOM Test","We intercepted a COM Error !" & @CRLF & @CRLF & _
  3. "err.description is: " & @TAB & $oMyError.description & @CRLF & _
  4. "err.windescription:" & @TAB & $oMyError.windescription & @CRLF & _
  5. "err.number is: " & @TAB & hex($oMyError.number,8) & @CRLF & _
  6. "err.lastdllerror is: " & @TAB & $oMyError.lastdllerror & @CRLF & _
  7. "err.scriptline is: " & @TAB & $oMyError.scriptline & @CRLF & _
  8. "err.source is: " & @TAB & $oMyError.source & @CRLF & _
  9. "err.helpfile is: " & @TAB & $oMyError.helpfile & @CRLF & _
  10. "err.helpcontext is: " & @TAB & $oMyError.helpcontext _
  11. )
  12. Local $err = $oMyError.number
  13. If $err = 0 Then $err = -1
  14. SetError($err) ; to check for after this function returns
  15. Endfunc
Se caso ocorre algum erro em seu script, essa função irá retornar uma janela com a descrição desse erro.

Share this post


Link to post
Share on other sites

Foi isto mesmo que eu fiz usando o exemplo do meu primeiro post mas não funcionou, veja o script incluindo estas funções que vc passou!

#include <File.au3>

$oMyError = ObjEvent("AutoIt.Error", "MyErrFunc")

$lista = _FileListToArray(@ScriptDir, "*.fake"); procura uma extensão que não existe
MsgBox(4096, "Mensagem!", $lista[1], 3); vai dar erro nesta linha

Func MyErrFunc()
	MsgBox(0, "AutoItCOM Test", "We intercepted a COM Error !" & @CRLF & @CRLF & _
			"err.description is: " & @TAB & $oMyError.description & @CRLF & _
			"err.windescription:" & @TAB & $oMyError.windescription & @CRLF & _
			"err.number is: " & @TAB & Hex($oMyError.number, 8) & @CRLF & _
			"err.lastdllerror is: " & @TAB & $oMyError.lastdllerror & @CRLF & _
			"err.scriptline is: " & @TAB & $oMyError.scriptline & @CRLF & _
			"err.source is: " & @TAB & $oMyError.source & @CRLF & _
			"err.helpfile is: " & @TAB & $oMyError.helpfile & @CRLF & _
			"err.helpcontext is: " & @TAB & $oMyError.helpcontext)
	Local $err = $oMyError.number
	If $err = 0 Then $err = -1
	SetError($err)
EndFunc   ;==>MyErrFunc

Share this post


Link to post
Share on other sites

 

Foi isto mesmo que eu fiz usando o exemplo do meu primeiro post mas não funcionou, veja o script incluindo estas funções que vc passou!

#include <File.au3>

$oMyError = ObjEvent("AutoIt.Error", "MyErrFunc")

$lista = _FileListToArray(@ScriptDir, "*.fake"); procura uma extensão que não existe
MsgBox(4096, "Mensagem!", $lista[1], 3); vai dar erro nesta linha

Func MyErrFunc()
	MsgBox(0, "AutoItCOM Test", "We intercepted a COM Error !" & @CRLF & @CRLF & _
			"err.description is: " & @TAB & $oMyError.description & @CRLF & _
			"err.windescription:" & @TAB & $oMyError.windescription & @CRLF & _
			"err.number is: " & @TAB & Hex($oMyError.number, 8) & @CRLF & _
			"err.lastdllerror is: " & @TAB & $oMyError.lastdllerror & @CRLF & _
			"err.scriptline is: " & @TAB & $oMyError.scriptline & @CRLF & _
			"err.source is: " & @TAB & $oMyError.source & @CRLF & _
			"err.helpfile is: " & @TAB & $oMyError.helpfile & @CRLF & _
			"err.helpcontext is: " & @TAB & $oMyError.helpcontext)
	Local $err = $oMyError.number
	If $err = 0 Then $err = -1
	SetError($err)
EndFunc   ;==>MyErrFunc

 

 

Belini,

 

Seu script está dando erro porque ele não retorna nenhum arquivo, por isso não pode considerar array. No meu diretório tenho alguns arquivos txt e mudei a extensão para procurar arquivos txt e ai sim retornou algo.

 

Coloca arquivos texto ai no seu diretório e tenta o código abaixo.

#include <File.au3>


$oMyError = ObjEvent("AutoIt.Error", "MyErrFunc")


$aArray = _FileListToArray(@ScriptDir, "*.txt"); procura uma extensão que não existe
MsgBox(4096, "Mensagem!", $aArray[0], 3); vai dar erro nesta linha


Func MyErrFunc()
MsgBox(0, "AutoItCOM Test", "We intercepted a COM Error !" & @CRLF & @CRLF & _
"err.description is: " & @TAB & $oMyError.description & @CRLF & _
"err.windescription:" & @TAB & $oMyError.windescription & @CRLF & _
"err.number is: " & @TAB & Hex($oMyError.number, 8) & @CRLF & _
"err.lastdllerror is: " & @TAB & $oMyError.lastdllerror & @CRLF & _
"err.scriptline is: " & @TAB & $oMyError.scriptline & @CRLF & _
"err.source is: " & @TAB & $oMyError.source & @CRLF & _
"err.helpfile is: " & @TAB & $oMyError.helpfile & @CRLF & _
"err.helpcontext is: " & @TAB & $oMyError.helpcontext)
Local $err = $oMyError.number
If $err = 0 Then $err = -1
SetError($err)
EndFunc   ;==>MyErrFunc

A função MyErrFunc detalha erros na execução do arquivo e não erro de sintaxe.

Edited by Israel

Share this post


Link to post
Share on other sites

 

Seu script está dando erro porque ele não retorna nenhum arquivo, por isso não pode considerar array. No meu diretório tenho alguns arquivos txt e mudei a extensão para procurar arquivos txt e ai sim retornou algo.

 

 

 

Mais eu já fiz desta foram prá dar erro mesmo, não quero corrigir o script e sim pegar as informações que aparecem na MsgBox() quando existe algum erro no script então se esta função não detalha erros de sintaxe não vai servir para o que eu quero!

Edited by Belini

Share this post


Link to post
Share on other sites

Uma solução seria uma segunda instância do programa ser responsável por gerar o LOG... Sei que não é isso que você procura, mas ele armazenaria os dados da MsgBox....

Share this post


Link to post
Share on other sites

Uma solução seria uma segunda instância do programa ser responsável por gerar o LOG...

 

Desde que gere o log serve sim, como faz para ter esta segunda instância?

Share this post


Link to post
Share on other sites

 

Desde que gere o log serve sim, como faz para ter esta segunda instância?

 

Dessa forma eu não conheço uma função que te descreve erros previsto pelo editor. O que vc pode fazer é contornar esse erro em seu script:

 

#include <File.au3>


$oMyError = ObjEvent("AutoIt.Error", "MyErrFunc")


$aArray = _FileListToArray(@ScriptDir, "*.fake"); procura uma extensão que não existe


If IsArray($aArray) Then
ConsoleWrite("Retornou algo!" & @CRLF)
MsgBox(4096, "Mensagem!", $aArray[0], 3); vai dar erro nesta linha
Else
ConsoleWrite("Não existe desse arquivo nesse diretório!" & @CRLF)
EndIf




Func MyErrFunc()
MsgBox(0, "AutoItCOM Test", "We intercepted a COM Error !" & @CRLF & @CRLF & _
"err.description is: " & @TAB & $oMyError.description & @CRLF & _
"err.windescription:" & @TAB & $oMyError.windescription & @CRLF & _
"err.number is: " & @TAB & Hex($oMyError.number, 8) & @CRLF & _
"err.lastdllerror is: " & @TAB & $oMyError.lastdllerror & @CRLF & _
"err.scriptline is: " & @TAB & $oMyError.scriptline & @CRLF & _
"err.source is: " & @TAB & $oMyError.source & @CRLF & _
"err.helpfile is: " & @TAB & $oMyError.helpfile & @CRLF & _
"err.helpcontext is: " & @TAB & $oMyError.helpcontext)
Local $err = $oMyError.number
If $err = 0 Then $err = -1
SetError($err)
EndFunc   ;==>MyErrFunc

Share this post


Link to post
Share on other sites

Quando se sabe onde o erro está é fácil contornar e até preifro usar o @Error prá detectar e lidar com eles mas o problema é quando se tem um código muito grande que alguma coisa passa desapercebida aí só dá o erro quando executar aquela parte do código.

#include <File.au3>

$aArray = _FileListToArray(@ScriptDir, "*.fake"); procura uma extensão que não existe
If @error Then
	ConsoleWrite("Não existe desse arquivo nesse diretório!" & @CRLF)
Else
	ConsoleWrite("Retornou algo!" & @CRLF)
	MsgBox(4096, "Mensagem!", $aArray[0], 3); vai dar erro nesta linha
EndIf
Edited by Belini

Share this post


Link to post
Share on other sites

 

Desde que gere o log serve sim, como faz para ter esta segunda instância?

 

Bom, vamos ver se consigo explicar, rs...

Seria um outro script rodando, que poderia ter sido chamado pelo seu principal na inicialização, esse script ficaria num loop, verificando a existência da janela (http://autoitbrasil.com/forum/uploads/monthly_06_2015/post-123-0-08341200-1434578872.jpg) usando algo como "if Winexists("AutoIt Error") then..." caso a janela exista, vc pode usar "WinGetText" e armazenar no seu arquivo de log...

Share this post


Link to post
Share on other sites

 

Quando se sabe onde o erro está é fácil contornar e até preifro usar o @Error prá detectar e lidar com eles mas o problema é quando se tem um código muito grande que alguma coisa passa desapercebida aí só dá o erro quando executar aquela parte do código.

 

 

Entendi. Recentemente fiz um script que está cheio de if @error. O que vc procura é algo necessário. Vou pesquisar por aqui também, mas se descobrir compartilha conosco.

Share this post


Link to post
Share on other sites

 

Quando se sabe onde o erro está é fácil contornar e até preifro usar o @Error prá detectar e lidar com eles mas o problema é quando se tem um código muito grande que alguma coisa passa desapercebida aí só dá o erro quando executar aquela parte do código.

#include <File.au3>

$aArray = _FileListToArray(@ScriptDir, "*.fake"); procura uma extensão que não existe
If @error Then
	ConsoleWrite("Não existe desse arquivo nesse diretório!" & @CRLF)
Else
	ConsoleWrite("Retornou algo!" & @CRLF)
	MsgBox(4096, "Mensagem!", $aArray[0], 3); vai dar erro nesta linha
EndIf

 

@Belini,

 

Talvez possa ser o que está querendo ou possa te dar uma luz.

 

https://www.autoitscript.com/forum/topic/145096-_autoiterrortrapau3-udf-error-detection-in-autoit-scripts/

 

 

 

Israel

Share this post


Link to post
Share on other sites

@Israel esta UDF do @jscript eu já uso e já me salvou muitas vezes porém não sei dizer porque as vezes o script dá algum erro que a UDF não grava por isto eu queri interceptar a mensagem de erro gerada pelo próprio Autoit!

Share this post


Link to post
Share on other sites

saber onde é chamada a função que mostra uma MsgBox() quando há erros críticos no script

(...)

porém não sei dizer porque as vezes o script dá algum erro que a UDF não grava por isto eu queri interceptar a mensagem de erro gerada pelo próprio Autoit!

Olá!

 

Infelizmente a única forma de interceptar a mensagem de erro do AutoIt é da forma que eu fiz em minha UDF, porém a questão não é "saber onde é chamada a função" pois ela é feita em C++: a base do Autoit.

Tenha em mente que se existem erros críticos é devido a códigos com erros de programação e em geral de sintaxe e/ou uso errado de alguma função da linguagem!

 

JS

Share this post


Link to post
Share on other sites

Olá!

 

Infelizmente a única forma de interceptar a mensagem de erro do AutoIt é da forma que eu fiz em minha UDF, porém a questão não é "saber onde é chamada a função" pois ela é feita em C++: a base do Autoit.

Tenha em mente que se existem erros críticos é devido a códigos com erros de programação e em geral de sintaxe e/ou uso errado de alguma função da linguagem!

 

JS

 

 

 

JScript,

 

Como o Belini explicou acima, seria interessante acredito que para todos que usam o AutoIt ter uma UDF que trate algum erro depois que o script foi iniciado sem ter que ficar usando if @erro.

Erros de sintaxe o editor nos mostra, mas erros durante a aplicação tem que ser tratados pelo if @erro, uma aplicação complexa exige muitos if @erro dando riscos de esquecer algum e etc

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now


×