O comando BEGIN SEQUENCE define uma estrutura sequencial de controle dentro do fluxo de execução de um programa, permitindo a sua interrupção na ocorrência de um determinado evento. Além disso, delimita um bloco de instruções, incluindo a invocação de funções.
Dentro de um bloco de sequência construído através desse comando, há algumas restrições quanto aos comandos que são permitidos entre um BEGIN SEQUENCE e um RECOVER. É permitido executar um RETURN, mas não um LOOP ou um EXIT de comandos WHILE ... ENDDO ou FOR ... NEXT externos à sequência. Todavia, entre um RECOVER e um END SEQUENCE é permitido executar um LOOP, um EXIT ou um BREAK, uma vez que a sequência já foi completada até este ponto.
A utilização do comando LOOP dentro de um bloco definido pelo comando RECOVER é útil para permitir a uma nova execução do bloco de sequência definido, após o erro ocorrido ter sido tratado ou recuperado.
A estrutura definida pelo comando BEGIN SEQUENCE ... END SEQUENCE é bastante flexível. Várias podem ser intercaladas e mais de uma pode ser definida dentro de uma mesma função.
Bloco de código | ||
---|---|---|
| ||
BEGIN SEQUENCE
...
< instruções >
...
[ BREAK [ < expressão > ] ]
...
< instruções >
...
[ RECOVER [ USING < variável > ] ]
...
< instruções >
...
END SEQUENCE |
Nome | Tipo | Descrição | Obrigatório | Referência |
---|---|---|---|---|
BEGIN SEQUENCE | Expressão | Define o inicio do bloco de código contendo o controle de erro | Sim | Não |
BREAK < expressão > | Expressão |
Sintaxe
BEGIN SEQUENCE
...
< instruções >
...
[ BREAK [ < expressão > ] ]
...
< instruções >
...
[ RECOVER [ USING < variável > ] ]
...
< instruções >
...
END SEQUENCE
Propósito
O comando BEGIN SEQUENCE define uma estrutura sequencial de controle dentro do fluxo de execução de um programa, permitindo a sua interrupção na ocorrência de um determinado evento.
Argumentos
BREAK < expressão >
...
Desvia o fluxo de execução para a linha de instrução imediatamente seguinte ao próximo comando RECOVER, se houver um especificado. Caso não exista, o fluxo de execução será desviado para a linha de instrução imediatamente seguinte ao comando END SEQUENCE. |
...
A expressão ( < expressão > ) é um valor que será atribuído à variável ( < variável > ) especificada pela cláusula USING do comando RECOVER. | Não |
...
Não |
RECOVER USING < variável > |
...
Variável | Define um ponto de recuperação, dentro do bloco de sequência, para o qual o fluxo de execução será desviado após a execução de um comando BREAK. Se a cláusula USING < variável > for especificada, esta variável receberá o valor fornecido pelo comando BREAK. | Não |
...
Não |
END SEQUENCE |
...
Expressão | Define o fim do bloco de sequência. Após a execução do comando BREAK, o fluxo de execução é desviado para a primeira linha de instrução após o comando END SEQUENCE, caso não tenha sido especificado um comando RECOVER dentro da sequência. |
...
Sim |
Utilização
O comando BEGIN SEQUENCE ... END SEQUENCE é uma estrutura de controle que facilita a construção de sistemas de tratamento de erros ou exceções. Ele delimita um bloco de instruções, incluindo a invocação de funções.
Dentro de um bloco de sequência construído através desse comando, há algumas restrições quanto aos comandos que são permitidos entre um BEGIN SEQUENCE e um RECOVER. É permitido executar um RETURN, mas não um LOOP ou um EXIT de comandos WHILE ... ENDDO ou FOR ... NEXT externos à sequência. Todavia, entre um RECOVER e um END SEQUENCE é permitido executar um LOOP, um EXIT ou um BREAK, uma vez que a sequência já foi completada até este ponto.
A utilização do comando LOOP dentro de um bloco definido pelo comando RECOVER é útil para permitir a reexecução do bloco de sequência definido, após o erro ocorrido ter sido tratado ou recuperado.
A estrutura definida pelo comando BEGIN SEQUENCE ... END SEQUENCE é bastante flexível. Várias podem ser intercaladas e mais de uma pode ser definida dentro de uma mesma função.
Exemplos
Não |
03. EXEMPLOS
A estrutura A estrutura típica do comando BEGIN SEQUENCE é exemplificada abaixo:
BEGIN SEQUENCE
...
< instruções >
...
IF < condição de erro / exceção >
BREAK
ENDIF
...
< instruções >
...
RECOVER
...
< instruções para o tratamento do erro >
...
END SEQUENCE
Bloco de código |
---|
user function Example
// Define um code block de tratamento de erro e guarda o code block atual
Local oError := Errorblock({|e| Break(e) })
Begin Sequence
var := var+1 // variavel não existe, logo, vai dar erro nesta linha
conout( "Recover... Isto NÃO DEVE ser executado, de acordo com o break lançado no ErrorBlock" )
return .T.
Recover
conout("Isto DEVE ser executado... entrou no recover")
End Sequence
conout( "Isto DEVE ser executado" )
// Restaura o code block de tratamento de erro original
ErrorBlock( oError )
Return 0 |
...