API Basic Try it - LIHACHTETAN/ClassicUO-BadNewbie-BasicIDE GitHub Wiki

Try / Catch / Finally / Throw

ClassicUO • Basic

Try gestisce gli errori di esecuzione del proprio corpo e delle funzioni chiamate. Catch riceve l’errore, Finally completa l’operazione e Throw crea o rilancia un errore. Un risultato API 0 o false va controllato esplicitamente: non attiva automaticamente Catch.

Sintassi esatta

Try
    statements
Catch
    handlerStatements
Finally
    cleanupStatements
End Try
Catch name
Catch name As Exception
Catch name As String
Throw stringExpression
Throw

Parametri

  • Try / statements — Try richiede un Catch, un Finally o entrambi prima di End Try. I blocchi possono essere annidati. Se il corpo riesce, Catch viene saltato. Questo sottoinsieme non implementa più Catch, filtri When o Exit Try.
  • Catch / name / As type — La variabile Catch è facoltativa. name riceve il messaggio come String. As String indica questa rappresentazione; As Exception è una forma di compatibilità, non un oggetto .NET o filtro di tipo. Altri tipi sono rifiutati. Un nuovo nome diventa locale alla procedura e nasconde una globale omonima. Una locale esistente riceve un’assegnazione rispettando tipo/Const. Dichiarare uno String prima di Try se serve anche senza eseguire Catch.
  • Finally / End Try — Finally è facoltativo se esiste Catch e può avere corpo vuoto. Completamento normale, errori, Return, Exit Sub/Function e trasferimenti di ciclo/GoTo verso l’esterno eseguono i Finally interessati. End Try è obbligatorio. L’annullamento evita intenzionalmente Catch e il Finally dello script per non ritardare l’arresto di emergenza.
  • Throw stringExpression — Throw stringExpression valuta il messaggio una volta e genera un nuovo errore di script. Serve String; convertire esplicitamente altri valori con CStr. È una forma Basic, non Throw New Exception(...) di VB.NET. Senza gestore fallisce l’esecuzione corrente, non tutti gli altri script.
  • Throw — Throw senza messaggio è valido solo dentro Catch, inclusi i blocchi annidati. Rilancia l’errore attivo mantenendo testo, file e riga originali. Una funzione chiamata da Catch necessita di un proprio Catch per questa forma.

Restituisce

Try/Catch/Finally e Throw non restituiscono ID, numeri o Boolean. Catch espone il messaggio in name; Throw trasferisce il controllo invece di restituire un valore. Gli esempi restituiscono esplicitamente due String e Integer 13 da Main. Le API chiamate conservano il proprio contratto di ritorno.

Comportamento

  • La preparazione verifica i blocchi e vieta GoTo/On Error GoTo dentro Try, Catch o Finally. Il generatore conserva gli indirizzi di gestione e finalizzazione. Ogni chiamata ha i propri gestori attivi; l’errore raggiunge il Catch idoneo più vicino. Un errore in Catch passa attraverso il suo Finally a un gestore esterno. In assenza di gestione strutturata possono intervenire le normali regole On Error.
  • Ritorno, errore o salto in sospeso sono conservati durante Finally. La finalizzazione annidata procede dall’interno verso l’esterno. Un nuovo errore in Finally sostituisce quello in sospeso. Basic permette anche Return e salti uscenti da Finally, sostituendo la continuazione in sospeso: è diverso da VB.NET. Il rilancio conserva la prima posizione dell’errore, anche da funzioni chiamate.
  • Pausa/arresto rimangono attivi. Try non crea thread, tentativi ripetuti o attese. Gli indirizzi preparati vengono riutilizzati; controllare direttamente le condizioni normali anziché usare eccezioni. L’arresto di emergenza salta la finalizzazione dello script; le risorse gestite dall’host seguono la propria durata di vita nel motore.
  • 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. Convalidare il parametro e salvare il messaggio

# CheckedAmount riceve amount=-2 come Integer tramite ByVal. Il valore negativo genera Throw "amount must be non-negative". Catch riceve lo String in problem e lo copia in message; As Exception non crea un oggetto. Finally imposta finished=1. Main restituisce "amount must be non-negative:1". Un valore non negativo tornerebbe normalmente senza Catch.
Option Explicit On
Function CheckedAmount(ByVal amount As Integer) As Integer
    If amount < 0 Then
        Throw "amount must be non-negative"
    End If
    Return amount
End Function

Sub Main()
    Dim message=""
    Dim finished=0
    Try
        CheckedAmount(-2)
    Catch problem As Exception
        message=problem
    Finally
        finished=1
    End Try
    Return message & ":" & CStr(finished)
End Sub

Spiegazione dei parametri e dell’esecuzione:

CheckedAmount riceve amount=-2 come Integer tramite ByVal. Il valore negativo genera Throw "amount must be non-negative". Catch riceve lo String in problem e lo copia in message; As Exception non crea un oggetto. Finally imposta finished=1. Main restituisce "amount must be non-negative:1". Un valore non negativo tornerebbe normalmente senza Catch.

2. Rilanciare verso l’esterno

# Il Throw interno genera "missing item". Catch interno imposta trace=1; Throw senza messaggio mantiene lo stesso errore. Finally interno aggiunge 2, Catch esterno copia outerProblem in message e aggiunge 3, Finally esterno aggiunge 4. Main restituisce "1234:missing item". trace rappresenta l’ordine di esecuzione, non un codice di errore.
Option Explicit On
Sub Main()
    Dim trace=0
    Dim message=""
    Try
        Try
            Throw "missing item"
        Catch problem
            trace=1
            Throw
        Finally
            trace=trace*10+2
        End Try
    Catch outerProblem
        message=outerProblem
        trace=trace*10+3
    Finally
        trace=trace*10+4
    End Try
    Return CStr(trace) & ":" & message
End Sub

Spiegazione dei parametri e dell’esecuzione:

Il Throw interno genera "missing item". Catch interno imposta trace=1; Throw senza messaggio mantiene lo stesso errore. Finally interno aggiunge 2, Catch esterno copia outerProblem in message e aggiunge 3, Finally esterno aggiunge 4. Main restituisce "1234:missing item". trace rappresenta l’ordine di esecuzione, non un codice di errore.

3. Finalizzare ogni iterazione iniziata

# number assume 1, 2 e 3. Solo 1 viene aggiunto a total: Continue For salta 2, Exit For termina a 3. Tutti i tre Try iniziati eseguono Finally, quindi finished=3. Main restituisce 1*10+3=13. Finally non richiede un errore; il trasferimento del ciclo attende la finalizzazione dell’iterazione.
Option Explicit On
Sub Main()
    Dim total=0
    Dim finished=0
    For Var number=1 To 3
        Try
            If number=2 Then
                Continue For
            End If
            If number=3 Then
                Exit For
            End If
            total+=number
        Finally
            finished+=1
        End Try
    Next
    Return total*10+finished
End Sub

Spiegazione dei parametri e dell’esecuzione:

number assume 1, 2 e 3. Solo 1 viene aggiunto a total: Continue For salta 2, Exit For termina a 3. Tutti i tre Try iniziati eseguono Finally, quindi finished=3. Main restituisce 1*10+3=13. Finally non richiede un errore; il trasferimento del ciclo attende la finalizzazione dell’iterazione.


en · ru · uk · fr · de · it · es · zh-tw · ja · ko

Basic