API Basic OnError it - LIHACHTETAN/ClassicUO-BadNewbie-BasicIDE GitHub Wiki
On Error / Resume
ClassicUO • Basic
On Error sceglie come gestire gli errori successivi nella procedura o funzione corrente. È un’istruzione del linguaggio, non un’API. Per gestione strutturata e pulizia usa Try/Catch/Finally.
Sintassi esatta
On Error GoTo label
On Error Resume Next
On Error GoTo 0
label:
Resume
Resume Next
Parametri
label— Etichetta esistente nella stessa procedura, scritta label: su una riga propria. Può precedere o seguire On Error, senza distinzione di maiuscole. Non è funzione, stringa o numero di riga. Un’etichetta sconosciuta dà SC009; il client blocca lo script.Resume Next / On Error— On Error Resume Next continua automaticamente dopo l’istruzione fallita senza etichetta. Le istruzioni riuscite non cambiano. Vale nell’invocazione corrente, non per tutti gli script.0— On Error GoTo 0 disattiva il modo. Zero è un valore di controllo speciale, non etichetta o risultato Boolean. Altre etichette numeriche e GoTo -1 non sono supportate.Resume / Resume Next— Nel gestore Resume ripete l’istruzione fallita; Resume Next prosegue dopo. Richiedono un errore registrato e ne cancellano l’indirizzo dopo il trasferimento. Nessun argomento etichetta o timeout.
Restituisce
On Error e Resume non restituiscono valori. Un errore gestito non diventa TRUE/FALSE e non ripara l’assegnazione. Gli esempi restituiscono esplicitamente Integer 5,18,10. Nessun annullamento automatico degli effetti precedenti.
Comportamento
- La preparazione risolve le etichette dopo tutta la procedura, in entrambe le direzioni. Il modo è memorizzato; in caso di eccezione Try viene considerato prima di On Error.
- Il motore conserva l’indirizzo dell’istruzione fallita. Il modo etichetta salta al gestore; Resume Next automatico salta l’istruzione. Resume rivaluta espressioni e chiamate: correggi prima la causa e considera gli effetti ripetuti.
- GoTo 0 non cancella l’indirizzo in attesa. Il gestore può disattivarsi, riparare e poi Resume. Disattivalo prima delle operazioni che potrebbero fallire per evitare il rientro.
- Errori sintattici e annullamento non vengono recuperati. Restituire 0, FALSE o uno stato negativo senza eccezione non richiama On Error: controlla il risultato del comando.
- Evita l’ingresso normale nel gestore con Return o GoTo. Ogni procedura chiamata ha il proprio modo; errori non gestiti possono risalire al chiamante. Resume ripete allora l’intera chiamata, non una riga interna. Nessun limite di tentativi o ritardo automatico.
- Se un errore esce da Try dopo la pulizia e raggiunge un gestore esterno On Error GoTo, Resume ripete l’intero Try dall’intestazione. Resume Next e On Error Resume Next continuano dalla prima istruzione dopo End Try. Le azioni già eseguite possono ripetersi; non si rientra a metà del corpo terminato.
Esempi
1. Saltare un’assegnazione fallita
# values[0] alloca una cella; l’indice 5 è errato. result=1. On Error Resume Next salta la lettura fallita prima dell’assegnazione, lasciando 1. GoTo 0 disattiva; result+=4 dà 5. Main restituisce 5 senza considerare riuscita la lettura.
Option Explicit On
Sub Main()
Dim values[0]
Var result = 1
On Error Resume Next
result = values[5]
On Error GoTo 0
result += 4
Return result
End Sub
Spiegazione dei parametri e dell’esecuzione:
values[0] alloca una cella; l’indice 5 è errato. result=1. On Error Resume Next salta la lettura fallita prima dell’assegnazione, lasciando 1. GoTo 0 disattiva; result+=4 dà 5. Main restituisce 5 senza considerare riuscita la lettura.
2. Riparare e riprovare
# ReadCell memorizza 8 nella cella 0 ma index=2. L’errore salta a FixIndex. GoTo 0 disattiva; handled=1, index=0. Resume ripete result=values[index], ora con 8. Return impedisce l’ingresso normale nel gestore. Main riceve 18.
Option Explicit On
Function ReadCell()
Dim values[0]
values[0] = 8
Var index = 2
Var handled = 0
Var result = 0
On Error GoTo FixIndex
result = values[index]
Return handled * 10 + result
FixIndex:
On Error GoTo 0
handled += 1
index = 0
Resume
End Function
Sub Main()
Return ReadCell()
End Sub
Spiegazione dei parametri e dell’esecuzione:
ReadCell memorizza 8 nella cella 0 ma index=2. L’errore salta a FixIndex. GoTo 0 disattiva; handled=1, index=0. Resume ripete result=values[index], ora con 8. Return impedisce l’ingresso normale nel gestore. Main riceve 18.
3. Gestore prima della registrazione
# GoTo Work salta Failed all’ingresso normale. On Error GoTo Failed installa quell’etichetta precedente. L’indice 2 fallisce prima di modificare result. Il gestore si disattiva, incrementa handled e con Resume Next raggiunge Return. Risultato 10; le etichette non sono procedure.
Option Explicit On
Sub Main()
Dim values[0]
Var result = 0
Var handled = 0
GoTo Work
Failed:
On Error GoTo 0
handled += 1
Resume Next
Work:
On Error GoTo Failed
result = values[2]
Return handled * 10 + result
End Sub
Spiegazione dei parametri e dell’esecuzione:
GoTo Work salta Failed all’ingresso normale. On Error GoTo Failed installa quell’etichetta precedente. L’indice 2 fallisce prima di modificare result. Il gestore si disattiva, incrementa handled e con Resume Next raggiunge Return. Risultato 10; le etichette non sono procedure.