Página 1 de 1

Evitar o pause em caso de runtime error.

Enviado: 03 Jul 2019 10:58
por FlavioDBF
Bom dia a todos do fórum.
Quando um programa compilado pelo Harbour, rodando no prompt de comando, gera um erro durante a execução (runtime error), antes de aparecer o código com o erro, é necessário pressionar a tecla ENTER, só então o programa é interrompido e a mensagem de erro e seu respectivo código aparece.
Gostaria de saber se é possível evitar esse pause e após a detecção de um erro, o programa já ser interompido e gerar o código de erro e outros warnings.

Evitar o pause em caso de runtime error.

Enviado: 04 Jul 2019 08:06
por JoséQuintas
A rotina que trata erros é a ERRORSYS.PRG
Pode pegar esse fonte do Harbour e modifica-lo do jeito que quiser.

Evitar o pause em caso de runtime error.

Enviado: 17 Jul 2019 11:45
por FlavioDBF
Olá José.
Obrigado pela sugestão.
Consegui resolver o problema com o uso do bloco BEGIN SEQUENCE...RECOVER...END SEQUENCE, que faz o mesmo que as instruções TRY...CATCH...FINALLY faz em outras linguagens.
Dessa forma, ao ocorrer um runtime error, o programa é finalizado e o error code 1 é lançado.
Veja aí como ficou:

* Testando a integridade do arquivo "planilha_regularidade.dbf".
BEGIN SEQUENCE WITH {| oError | oError:cargo := { ProcName( 1 ), ProcLine( 1 ) }, Break( oError ) }
use "c:\SinanDashboard\dbf\ger\planilha_regularidade.dbf\planilha_regularidade.dbf"
RECOVER USING oError
errorlevel(1)
quit
end

Evitar o pause em caso de runtime error.

Enviado: 17 Jul 2019 14:32
por JoséQuintas
Eu não escondo erro dos clientes, se tiver que dar erro aparece lá aberto no bloco de notas.
Mas gravo o erro em um arquivo, e depois envio pra mim por email.
Isso é melhor, porque assim os erros vão ser resolvidos, ao invés de apenas serem escondidos.
Pode aparecer até erro que você nem sabia que existia - aconteceu isso comigo na época do Clipper

Minha errorsys é pública, tá pra quem quiser.
AppVersaoExe() é uma função necessária, mas é só pra retornar a versão do EXE em string "2019.07.17.1428" por exemplo.

Errorsys só precisa mostrar/gravar erro, melhor não alterar mais nada, porque senão pode até atrapalhar ao invés de ajudar.

é basicamente a do Clipper, alterada pra salvar o erro em hb_Out.log, e abrir no bloco de notas.
o nome não foi escolhido à toa: o Harbour já usa esse nome pra outros erros que não passam pela errorsys.
O fonte está aqui:

https://github.com/JoseQuintas/JoseQuin ... rorsys.prg

Sobre o email de erro:
O aplicativo, ao detectar um hb_out.log contendo texto, envia por email.
Com isso, faço o teste se o terminal tem acesso à internet - resultado: se o terminal não tem internet, outro que tenha transmite o email.
Simples e prático.

Isso ajudou muuuuuito... ajudou a deixar tudo redondo, e até resolver problemas antes do cliente ligar.
Além de já resolver antes que acontecessem em outros clientes...

É só uma idéia... pense nisso.

Evitar o pause em caso de runtime error.

Enviado: 19 Jul 2019 08:56
por FlavioDBF
Obrigado pelas considerações e pelas dicas José.
Mas a idéia aqui não é esconder os erros.
Onde eu trabalho utilizamos bastante arquivos DBF para intercâmbio de dados, sendo praticamente um formato padrão para isso, principalmente com a utilização de programas como o Tabwin (http://www2.datasus.gov.br/DATASUS/inde ... rea=060805).
Estou desenvolvendo uma aplicação em C# e consigo manipular os arquivos DBF com SQL usando um drive FoxPro OLE DB Provider. No entanto, essa técnica tem limitações, principalmente quando se trata de blocos de comando.
Dessa forma a solução foi o uso do Harbour.
O programa em C# chama um executável construído em Harbour para realizar algum processamento quando necessário. Acontece que nessa execução do programa feito em Harbour pode ocorrer um erro, como um arquivo DBF que não está onde deveria. Assim, usando o bloco BEGIN SEQUENCE, quando um erro ocorre, a instrução ERRORLEVEL(1) é gerada e em seguida o comando QUIT.
Dessa maneira o programa chamador em C# percebe que um erro aconteceu e trata esse problema:

if (process0.ExitCode != 0)
{
MessageBox.Show("Os campos do arquivo 'planilha_regularidade.dbf' não foram alterados pela classe 'Altera_DBF'.");
erro = "Y";
return this.erro;
}
else
{
erro = "N";
return this.erro;

Além de mostrar uma mensagem para o usuário, um arquivo de log também será gerado com o dia e data do problema usando o framework log4net.
Trata-se de uma dobradinha, C# + Harbour, o melhor de dois mundos.

Evitar o pause em caso de runtime error.

Enviado: 22 Jul 2019 01:34
por JoséQuintas
Basicamente é a função de envio de email do Harbour.
A classe é só pra organizar opções.
ze_sendmailclass.prg