duvida com begin sequence

Fórum sobre a linguagem CA-Clipper.

Moderador: Moderadores

porter
Usuário Nível 5
Usuário Nível 5
Mensagens: 1057
Registrado em: 10 Dez 2009 16:44
Localização: OLIMPIA-SP

duvida com begin sequence

Mensagem por porter »

ola pessoal, estou tentando aprender como se usa o begin sequence, olhei alguns exemplos aqui no forum e tambem no livro, mas esta dando erro e nao tratando como eu quero, estou fazendo da forma descrita abaixo, obrigado.

Código: Selecionar todos

clear
a = 0
do while .t.
    begin sequence
       a = a + "10" <-- erro aqui
    recover
       @ 10,10 say "Erro"
    end
   exit
enddo
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

duvida com begin sequence

Mensagem por alxsts »

Olá!

Crie o teu próprio manipulador de erros:

Código: Selecionar todos

Function main()

   LOCAL objLocal, bLastHandler, a := 0

   Altd()
   
   // Save current and set new error handler  // Altera o error handler padrão...
   bLastHandler := ERRORBLOCK({ |objErr| MyHandler(objErr, .T.) })
   
   BEGIN SEQUENCE
           
      a = a + "10" // <-- erro aqui 
                   // ==> Neste ponto executa internamente um 
                   // Eval( { |objErr| MyHandler(objErr, .T.) } ) 
                   // passando o objeto erro gerado (objErr) como parâmetro
                   // para o code block que por sua vez é repassado 
                   // para a função manipuladora de erros MyHandler()
           
   RECOVER USING objLocal
      
      // Send messages to objLocal and handle the error
      ? "Error: "
      IF objLocal:genCode != 0            // inspeciona e exibe as variáveis
         ?? objLocal:description          // de instância do objeto error
      ENDIF

   END
   
   // Restore previous error handler   // Restaura o error handler anterior (ErrorSys
   ERRORBLOCK( bLastHandler )          // padrão do Clipper ou outro customizado)
   
RETURN NIL
//-----------------------------------------------------------------------------
   
FUNCTION MyHandler( objError, lLocalHandler )
   
   // Handle locally returning the error object
   IF lLocalHandler              // como esta condição é verdadeira,
      BREAK objError             // devolve (throw) o objeto erro ao 
   ENDIF                         // bloco BEGIN SEQUENCE...RECOVER...END,
                                 // que o recebe de volta no parâmetro 
   RETURN NIL                    // da cláusula RECOVER (objLocal)
Edit:

Uma forma simplificada, para você comparar:

Código: Selecionar todos

Function main()

   LOCAL objLocal, bLastHandler, a := 0

   Altd()
   
   // Save current and set new error handler  // Altera o error handler padrão...
   bLastHandler := ERRORBLOCK({ |objErr| Break(objErr) })
   
   BEGIN SEQUENCE
           
      a = a + "10" // <-- erro aqui 
                   // ==> Neste ponto executa internamente um 
                   // Eval( { |objErr| MyHandler(objErr, .T.) } ) 
                   // passando o objeto erro gerado (objErr) como parâmetro
                   // para o code block que por sua vez o repassa 
                   // para o parâmetro objLocal, abaixo
           
   RECOVER USING objLocal
      
      // Send messages to objLocal and handle the error
      ? "Error: "
      IF objLocal:genCode != 0            // inspeciona e exibe as variáveis
         ?? objLocal:description          // de instância do objeto error
      ENDIF

   END
   
   // Restore previous error handler   // Restaura o error handler anterior (ErrorSys
   ERRORBLOCK( bLastHandler )          // padrão do Clipper ou outro customizado)
   
RETURN NIL
//-----------------------------------------------------------------------------
[]´s
Alexandre Santos (AlxSts)
Responder