Por que Begin Sequence em vez de try/catch?
AdvPL tem Begin Sequence/Recover/End Sequence pra tratamento de erro. Por que nao try/catch como linguagens modernas? Vem do Clipper.
Linguagens modernas (Java, C#, Python, JavaScript) tem try/catch. AdvPL tem Begin Sequence ... Recover ... End Sequence. Por que essa sintaxe estranha?
Sintaxe AdvPL
Local bErro := ErrorBlock({|e| ErrFunc(e)})
Local lOk := .F.
Begin Sequence
// codigo que pode falhar
ProcessarDados()
GravarBanco()
lOk := .T.
Recover
// tratamento de erro
ConOut("Falha capturada")
End Sequence
ErrorBlock(bErro)Comparacao com try/catch (TLPP moderno)
try
ProcessarDados()
GravarBanco()
catch tExceptionError oErr
conout('Falha: ' + oErr:getDescription())
endtryO TLPP tem try/catch nativo. O AdvPL classico nao.
Origem: Clipper anos 80
AdvPL e descendente direto do Clipper, linguagem da Nantucket Corp/Computer Associates pra ambiente xBase (DOS). Em 1986-90, OO+exception ainda nao era padrao em linguagens de mercado.
Clipper usava Begin Sequence / Break / Recover / End Sequence — um mecanismo de "saida controlada". A logica:
Begin Sequence: marca o inicioBreak: dispara saida forcada (similar athrow)Recover: codigo de tratamento (similar acatch)End Sequence: encerra
O ErrorBlock
Pra capturar erros runtime do sistema (divisao por zero, arquivo nao encontrado), Clipper definia ErrorBlock — um bloco de codigo executado quando erro acontecia. O bloco tipicamente disparava Break pra cair no Recover.
Local bErroAnterior := ErrorBlock({|e| Break(e)})
Begin Sequence
1 / 0 // dispara ErrorBlock automaticamente
Recover Using oErro
conout(oErro:description)
End Sequence
ErrorBlock(bErroAnterior) // restauraHeranca no AdvPL
Microsiga manteve essa sintaxe ao criar AdvPL (apos absorver o Siga Advanced) pra manter compatibilidade com codigo Clipper existente. O resultado:
- Codigo AdvPL classico: sempre
Begin Sequence/Recover - Codigo TLPP moderno: pode usar
try/catch - Mixagem: legivel mas estranho
Quando usar cada um
| Cenario | Usar |
|---|---|
| AdvPL legado, modulo TOTVS padrao | Begin Sequence |
| TLPP novo, classes modernas | try/catch |
| Custom function nova em fonte AdvPL classico | Begin Sequence (consistencia) |
| Web Service REST TLPP | try/catch |
Diferencas semanticas
- try/catch captura exceptions tipadas (
tExceptionErroretc) - Begin Sequence captura qualquer Break — flexivel mas menos tipado
- Performance: praticamente identica em runtime
- Legibilidade: try/catch mais limpo pra quem vem de outras linguagens
Curiosidade: AppServer suporta os dois
Voce pode ter, no MESMO RPO, codigo AdvPL com Begin Sequence chamando classe TLPP com try/catch. Ambos funcionam. E a TOTVS faz exatamente isso em modulos modernos.