ERRORBLOCK()
 Envia um bloco de código a ser avaliado quando ocorre um erro em tempo de
 execuçao
------------------------------------------------------------------------------

 Sintaxe

     ERRORBLOCK([<bErrorHandler>]) --> bCurrentErrorHandler

 Argumentos

     <bErrorHandler> é o bloco de código a ser executado toda vez que
     ocorrer um erro em tempo de execuçao.  Quando avaliado, o
     <bErrorHandler> é passado na forma de um objeto erro como um argumento
     pelo sistema.

 Retorno

     ERRORBLOCK() retorna o bloco de código corrente que tratará o erro.
     Caso nao tenha sido enviado nenhum bloco de tratamento de erro desde
     que o programa foi invocado, ERRORBLOCK() retorna o bloco de tratamento
     de erro padrao.

 Descriçao

     ERRORBLOCK() é uma funçao de tratamento de erros que define a atuaçao
     de um handler de erros sempre que ocorrer um erro em tempo de
     execuçao.  O manipulador de erros é especificado como um bloco de
     código da seguinte forma:

     { |<objError>| <lista de expressoes>,... }

     Onde <objError> é um error object que contém informaçoes sobre o erro.
     Dentro do bloco de código, podem ser enviadas mensagens ao error object
     para obter informaçoes sobre o erro.  Se o bloco de tratamento de erros
     retornar verdadeiro (.T.), a operaçao que falhou é repetida, e se
     retornar falso (.F.), o processamento recomeça.

     O bloco de tratamento de erros pode ser especificado como uma lista de
     expressoes ou como uma chamada a uma funçao definida por usuário.  Uma
     chamada a uma funçao definida por usuário é mais útil pois você pode
     utilizar declaraçoes de controle do Clipper ao invés de expressoes.
     Este é em particular o caso se houver um BEGIN SEQUENCE pendente e você
     deseja BREAK para a próxima declaraçao RECOVER.

     Como consequência, blocos de tratamento de erro podem ser utilizados em
     combinaçao com estruturas de controle BEGIN SEQUENCE...END.  Dentro de
     um bloco de tratamento de erros, você manipula erros comuns, de baixo
     nível, e de dispositivos que têm um mecanismo de recuperaçao geral.  Se
     a operaçao necessita tratamento de erros específicos, defina um BEGIN
     SEQUENCE e depois BREAK para a declaraçao RECOVER, retornando o error
     object para processamento local.  Veja o exemplo abaixo.

     Se nao foi especificado nenhum <bErrorHandler> utilizando ERRORBLOCK()
     e ocorrer um erro em tempo de execuçao, o bloco de tratamento ao de
     erros padrao é avaliado.  Este manipulador de erros exibe uma mensagem
     descritiva na tela, ajusta a funçao ERRORLEVEL() para 1, e depois sai
     do programa (QUIT).

     Como ERRORBLOCK() retorna o bloco de tratamento ao de erros corrente, é
     possível especificar um bloco de tratamento de erros para uma operaçao
     gravando-se o bloco de manipulaçao de erros corrente e depois
     recuperando-o após o final da operaçao.  Além disso, uma importante
     consequência do fato de os blocos de tratamento de erros serem
     especificados como blocos de código, é que eles podem ser passados para
     rotinas e funçoes definidas por usuário e depois retornadas como
     valores.

 Exemplos

     O fragmento de código a seguir ilustra como um bloco de tratamento de
     erros pode ser enviado e depois chamado quando há um erro dentro de uma
     construçao BEGIN SEQUENCE:

     LOCAL bErrorHandler, bLastHandler, objErr
     bErrorHandler := { |objError| MyErrorHandler(objError) }
     //
     bLastHandler := ERRORBLOCK(bErrorHandler)  // Salva manipulador corrente
     //
     BEGIN SEQUENCE
        .
        . <declaraçoes da operaçao>
        .
     RECOVER USING objErrorInfo           // Recebe objeto de erro de BREAK
        .
        . <declaraçoes de recuperaçao>
        .
     END
     ERRORBLOCK(bLastHandler)             // Restaura manipulador
     RETURN

     FUNCTION MyErrorHandler( objError )
        //
        BREAK objError                    // Retorna objeto para RECOVER
        RETURN NIL

 Arquivos:  Biblioteca CLIPPER.LIB.
 To download this example - click here.

See Also: BEGIN SEQUENCE