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.
Moderador: Moderadores
- JoséQuintas
- Administrador

- Mensagens: 20267
- Registrado em: 26 Fev 2007 11:59
- Localização: São Paulo-SP
Evitar o pause em caso de runtime error.
A rotina que trata erros é a ERRORSYS.PRG
Pode pegar esse fonte do Harbour e modifica-lo do jeito que quiser.
Pode pegar esse fonte do Harbour e modifica-lo do jeito que quiser.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
https://github.com/JoseQuintas/
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
https://github.com/JoseQuintas/
Evitar o pause em caso de runtime error.
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
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
- JoséQuintas
- Administrador

- Mensagens: 20267
- Registrado em: 26 Fev 2007 11:59
- Localização: São Paulo-SP
Evitar o pause em caso de runtime error.
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.
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.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
https://github.com/JoseQuintas/
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
https://github.com/JoseQuintas/
Evitar o pause em caso de runtime error.
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.
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.
- JoséQuintas
- Administrador

- Mensagens: 20267
- Registrado em: 26 Fev 2007 11:59
- Localização: São Paulo-SP
Evitar o pause em caso de runtime error.
Basicamente é a função de envio de email do Harbour.
A classe é só pra organizar opções.
ze_sendmailclass.prg
A classe é só pra organizar opções.
ze_sendmailclass.prg
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
https://github.com/JoseQuintas/
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
https://github.com/JoseQuintas/
