Pular para o conteúdo principal

Postagem em destaque

🚀 Oferecendo Serviços Remotos de Desenvolvedor AdvPL e Mais 🖥️

🚀 Oferecendo Serviços Remotos de Desenvolvedor AdvPL e Mais 🖥️ Olá pessoal, Espero que este post encontre todos vocês bem! É com grande entusiasmo que compartilho que estou expandindo meus serviços como Desenvolvedor AdvPL para novos desafios e colaborações. Com mais de duas décadas de experiência sólida, minha jornada profissional tem sido enriquecedora, com a oportunidade de participar de projetos empolgantes ao longo dos anos. Agora, estou ansioso para trazer minha experiência e habilidades para novas equipes e projetos, trabalhando de forma remota. Minha expertise abrange não apenas AdvPL, mas também outras tecnologias-chave, incluindo JS, SQL, Infraestrutura e Otimização de Processos. Acredito que essa combinação de conhecimentos me permite oferecer soluções abrangentes e eficazes para uma variedade de necessidades de desenvolvimento. Acredito que a tecnologia tem o poder de transformar negócios e impulsionar o sucesso, e estou comprometido em ajudar meus clientes a alcançar seu

Protheus :: Tratamento de Erro :: Simulando Try/Catch


Sabemos que para tratamento de erros/exceções em Advpl devemos trabalhar com as funções ErrorBlock() e/ou SysErrorBlock() e BEGIN SEGUENCE/RECOVER/END como no exemplo abaixo:


Function TrySample1()

//Salvando o bloco de erro do sistema e Atribuindo tratamento personalizado Local bError := ErrorBlock( { |oError| MyError( oError ) } )

BEGIN SEQUENCE

//Forçando um erro para avalia-lo.
__EXCEPTION__->ERROR := "__EXCEPTION__"
RECOVER
//"Se ocorreu erro, após o BREAK, venho para cá"
MsgInfo( "Peguei o Desvio do BREAK" )
END SEQUENCE

MsgInfo( "Continuo após o tratamento de erro" )

//Restaurando bloco de erro do sistema
ErrorBlock( bError )

Return( NIL )

Static Function MyError( oError )
MsgInfo( oError:Description , "Deu Erro" )
BREAK
Return( NIL )

Para Simular o mesmo tratamento acima, usando agora try/catch, que no nosso exemplo estará como TRYEXCEPTION, CATCHEXCEPTION e ENDEXCEPTION, proceda da seguinte forma:

Baixe o arquivo tryexception.ch clicando aqui. Inclua-o no cabeçalho do seu programa utilizando a seguine sintaxe: #include "tryexception.ch"

e, repetindo o exemplo anterior, teremos:


#include "tryexception.ch"

Static Function TrySample2()

Local bError := { |oError| MyError( oError ) }
Local oError

TRYEXCEPTION USING bError
//Forçando um erro para avalia-lo.
__EXCEPTION__->ERROR := "__EXCEPTION__"
CATCHEXCEPTION USING oError
//"Se ocorreu erro, após o BREAK, venho para cá"
MsgInfo( oError:Description , "Peguei o Desvio do BREAK" )
ENDEXCEPTION

MsgInfo( "Continuo após o tratamento de erro" )

Return( NIL )

Function TrySample3()

Local aParamX := {"Serei Alterado",2,3,4}
Local bError := { |oError,aParam| Error( oError , @aParam ) }
Local oMyError

TRY EXCEPTION USING bError PARAMETERS aParamX
__EXCEPTION__->EXCEPTION := "__EXCEPTION__"
CATCH EXCEPTION USING oMyError
MsgInfo( aParamX[1] , "Changed in Error" )
MsgInfo( oMyError:Description )
END EXCEPTION

Return( NIL )

Function TrySample4()

Local cAliasTmp := GetNextAlias()
Local cLike := "APT%"
Local oError
Local oException

BEGINSQL ALIAS cAliasTmp
SELECT
MAX(RC1.RC1_NUMTIT) RC1_NUMTIT
FROM
%table:RC1% RC1
WHERE
RC1.RC1_FILIAL = %exp:xFilial("RC1")% AND
RC1.RC1_NUMTIT LIKE %exp:cLike% AND
RC1.%NotDel%
ENDSQL

TRY EXCEPTION
IF ( cAliasTmp )->( Eof() .or. Empty( RC1_NUMTIT ) )
UserException("No Data")
TRYEXCEPTION
MsgInfo( ( cAliasTmp )->RC1_NUMTIT )
UserException("Data Found")
CATCHEXCEPTION
MsgInfo( oException:Description )
ENDEXCEPTION
EndIF
CATCH EXCEPTION USING oError
MsgInfo( oError:Description )
END TRY

Return( NIL )

Function Error( oError , aParameters )

IF !Empty( aParameters ) .and. ( Len( aParameters ) > 1 )
MsgInfo( AllToChar( aParameters[1] ) , "Call Stack: " + ProcName() ) aParameters[1] := "ProcName: " + ProcName() + " :: ProcLine: " + AllTrim( AllToChar( ProcLine() -1 ) ) + " ::Alterou o Conteúdo desse elemento do Array"
EndIF

Break

Return( NIL )


Se desejar baixar o arquivo de exemplo u_tsttrycatch.prg, clique aqui.

Para baixar todos os arquivos de exemplo usados neste "post" clique aqui.

[]s иαldσ dj



Comentários

  1. Naldo,

    Parabéns pelo Blog!
    Tenho uma situação que gostaria de sua opinião a respeito. Tenho a necessidade de automatizar a rotina de cadastramento de novos colaboradores no Exchange 2007. Sempre que informar um e-mail de novo colaborador e confirmar o cadastro deverá ser executada alguma rotina que efetue o cadastro básico no exchange deste. Quando ocorrer a rescisão deverá ser bloqueado seu a acesso no exchange. Acha que isso pode ser viável? Obrigado. Meu email é a.noel75@gmail.com

    ResponderExcluir
  2. Allan,

    Isso é possivel sim. Usando a combinação do Windows PowerShell e o protheus.

    Para exemplo de como executar o Windows PowerShell através do Protheus consulte:

    http://naldodjblogs.blogspot.com/2010/08/protheus-powershell-e-script-para.html

    Para informações de como Administrar o Exchange 2007 via PowerShell consulte:


    Exchange Server 2007 e Windows PowerShell:

    http://www.andersonpatricio.org/Artigos/Artigos.asp?Artigo=19


    User Administration in Exchange 2007 using Powershell CmdLets:

    http://www.msexchange.org/articles-tutorials/exchange-server-2007/management-administration/user-administration-exchange-2007-powershell-cmdlets.html

    Exchange Management Shell:
    http://technet.microsoft.com/en-us/library/bb123778.aspx

    ResponderExcluir
  3. Parabéns pelo Blog!
    Tambem tenho uma situação que gostaria de sua opinião. Estou consumindo pelo protheus um WS de um programa externo já pronto. No DotNet já tinha implantado o mesmo WS e nele fazia o tratamento dos erros em um bloco TryCatch. No protheus foi gerado o arquivo do WS pelo ADVPL WSDL Client 1.120703, e no programa que chama o metodo do WS quando acontece um erro não retorna nada, a variavel do metodo está totalmente vazia. Tentei colocar a chamada dentro do TRY que li acima, mas na execução do WS ele não gera uma exceção e não envia o erro. Gostaria de saber se já passou por isso?
    Obrigado.
    wendell.gt@pop.com.br

    ResponderExcluir
  4. Bom dia a todos!!!

    Tentei usar o segundo exemplo o que utiliza o #include "tryexception.ch", mas em uma rotina automática, e o que eu acabei descobrindo, que se o erro ocorre na rotina que esta montando o ExecAuto o Exception captura o erro e mostra na tela, porém se o erro ocorre na rotina acionada via ExecAuto, o Exception consegue impedir o INTERNAL SERVER ERROR, porém, retorna a variável padrão lMsErroAuto como true, como se não houvesse um erro.
    Eu acredito que o Exception não consegue capturar o erro ocorrido em outra thread, tem alguma solução para isso?

    Se precisar de um exemplo eu monto um e envio.

    Att

    ResponderExcluir

Postar um comentário

Postagens mais visitadas deste blog

BlackTDN :: RLeg ~ Desvendando a Função ParamBox

Para quem precisar desenvolver uma interface de entrada de dados, coisa rápida, e não quer ter aquele trabalhão danado que todos já sabemos, o Protheus tem uma função que ajuda muito, é uma interface semelhante a função Pergunte, porém com muito mais opção de objeto de entrada de dados, alias até colocar o scrollbox desta interface com todos os objetos em outra MsDialog ou Wizard é simples. Vejam o exemplo abaixo, boa sorte! Rleg. //---------------------------------------------------------- // Função exemplo utilizando a função ParamBox() //---------------------------------------------------------- User Function xParamBox() Local aRet := {} Local aParamBox := {} Local aCombo := {"Janeiro","Fevereiro","Março","Abril","Maio","Junho","Julho","Agosto","Setembro","Outubro","Novembro","Dezembro"} Local i := 0 Private cCadastro := "xParambox" // ---------------

BlackTDN :: Customizando a interface de Login no Protheus e by You

A publicação “ BlackTDN :: By You e sua nova tela de login ”  de nosso amigo OBona deu o que falar e, em função disso, esse que a muito não vos escreve resolveu criar uma versão onde será possível personalizar, “por completo”, a tela de login no Protheus/by You. Considerando que OBona já havia “mapeado, identificado e customizado” as imagens peguei-as emprestadas para o exemplo que se segue: O primeiro passo para a customização “total” da interface de login do Protheus/by You será implementar o “Ponto de Entrada” ChgPrDir (Diretório de impressão) . Usaremos esse PE juntamente como programa U_FindMsObject.prg (apresentado pela primeira vez em: Protheus :: ADVPL : The Container : Presents Pandora's box ). Diferente do exemplo proposto por OBona, que substitui, durante o processo de compilação, as imagens padrões do sistema (excluindo-as) por imagens customizadas (com o mesmo nome) este novo exemplo mantém, no RPO, as imagens padrões adicionando novas imagens customizadas que serã

Protheus :: Chamando Funções do Menu Diretamente e sem a Necessidade de Login

Ferne$ perguntou: "...é possível abrir alguma rotina do sistema sem solicitar login ao usuário, como por exemplo a rotina MATA010..." Sim Ferne$, é possível sim. Abaixo um Exemplo para a Chamada à função MATA010 sem a necessidade de Login no sistema. #INCLUDE "PROTHEUS.CH" #INCLUDE "TBICONN.CH" /*/ Funcao: MATA010Ex Data: 30/04/2011 Autor: Marinaldo de Jesus Descricao: Executar a Funcao MATA010 diretamente sem a necessidade de LOGIN no Protheus Sintaxe: 1 ) U_MATA010Ex ( Chamada diretamente na Tela de Entrada do Sistema ) ; ou 2 ) totvsclient.exe -q -p=u_MATA010Ex -a=01;01 -c=rnp_local -e=rnp -m -l ( Chamada Via Linha de Comando ) /*/ User Function MATA010Ex( cEmpFil ) Local aEmpFil Local bWindowInit := { || __Execute( "MATA010()" , "xxxxxxxxxxxxxxxxxxxx" , "MATA010" , "SIGAFAT" , "SIGAFAT", 1 , .T. ) } Local cEmp Local cFil Local cMod Local cModName := "SIGAFAT" DEFA