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())
endtry

O 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:

  1. Begin Sequence: marca o inicio
  2. Break: dispara saida forcada (similar a throw)
  3. Recover: codigo de tratamento (similar a catch)
  4. 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)  // restaura

Heranca no AdvPL

Microsiga manteve essa sintaxe ao criar AdvPL (apos absorver o Siga Advanced) pra manter compatibilidade com codigo Clipper existente. O resultado:

Quando usar cada um

CenarioUsar
AdvPL legado, modulo TOTVS padraoBegin Sequence
TLPP novo, classes modernastry/catch
Custom function nova em fonte AdvPL classicoBegin Sequence (consistencia)
Web Service REST TLPPtry/catch

Diferencas semanticas

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.

Veja também