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

Try / Catch / Finally / Throw

ClassicUO • Basic

Try trata errores de ejecución de su cuerpo y de las funciones llamadas. Catch recibe el error, Finally finaliza la operación y Throw crea o relanza un error. Un resultado API 0 o false debe comprobarse explícitamente: no activa Catch por sí solo.

Sintaxis exacta

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

Parámetros

  • Try / statements — Try necesita un Catch, un Finally o ambos antes de End Try. Los bloques pueden anidarse. Si el cuerpo termina correctamente se omite Catch. Este subconjunto no implementa varios Catch, filtros When ni Exit Try.
  • Catch / name / As type — La variable de Catch es opcional. name recibe el mensaje como String. As String indica esta representación; As Exception es una escritura compatible, no un objeto .NET ni un filtro de tipo. Se rechazan otros tipos. Un nombre nuevo es local a la rutina y oculta una global homónima. Una local existente recibe una asignación respetando tipo/Const. Declare un String antes de Try si debe existir aunque Catch no se ejecute.
  • Finally / End Try — Finally es opcional cuando existe Catch y puede tener un cuerpo vacío. La finalización normal, errores, Return, Exit Sub/Function y transferencias de bucle/GoTo hacia fuera ejecutan los Finally pertinentes. End Try es obligatorio. La cancelación omite deliberadamente Catch y el Finally del script para impedir que se retrase la parada de emergencia.
  • Throw stringExpression — Throw stringExpression evalúa una vez el mensaje y crea un error nuevo. Requiere String; convierta otros valores explícitamente con CStr. Es una forma Basic, no Throw New Exception(...) de VB.NET. Sin controlador falla la ejecución actual, no todos los demás scripts.
  • Throw — Throw sin mensaje solo se permite dentro de Catch, incluidos sus bloques anidados. Relanza el error activo conservando texto, archivo y línea originales. Una función llamada desde Catch necesita su propio Catch para esta forma.

Devuelve

Try/Catch/Finally y Throw no devuelven ID, número ni Boolean. Catch expone el mensaje mediante name; Throw transfiere el control en vez de devolver un valor. Los ejemplos devuelven explícitamente dos Strings e Integer 13 desde Main. Las API llamadas conservan sus contratos de retorno.

Comportamiento

  • La preparación valida los bloques y prohíbe GoTo/On Error GoTo hacia el interior de Try, Catch o Finally. El generador guarda las direcciones del controlador y la finalización. Cada llamada tiene sus controladores activos; el error llega al Catch válido más cercano. Un error en Catch pasa por su Finally hacia un controlador externo. Sin un controlador estructurado pueden aplicarse las reglas normales de On Error.
  • El retorno, error o salto pendiente se conserva durante Finally. La finalización anidada va desde dentro hacia fuera. Un error nuevo en Finally sustituye al pendiente. Basic también permite Return y saltos salientes desde Finally, que sustituyen la continuación pendiente; esto difiere de VB.NET. Relanzar conserva la primera ubicación del error, incluso de funciones llamadas.
  • Pausa/parada siguen activas. Try no crea hilos, reintentos ni esperas. Las direcciones preparadas se reutilizan; compruebe directamente las condiciones normales en vez de usar excepciones. La parada de emergencia omite la finalización del script; los recursos del host mantienen sus propias reglas de liberación en el motor.
  • Si un error sale de Try tras la limpieza y llega a un controlador externo On Error GoTo, Resume repite todo el Try desde su cabecera. Resume Next y On Error Resume Next continúan con la primera instrucción después de End Try. Las acciones ya realizadas pueden repetirse; no se vuelve al interior del cuerpo finalizado.

Ejemplos

1. Validar un parámetro y guardar el mensaje

# CheckedAmount recibe amount=-2 como Integer por ByVal. El valor negativo provoca Throw "amount must be non-negative". Catch recibe ese String en problem y lo copia a message; As Exception no crea un objeto. Finally establece finished=1. Main devuelve "amount must be non-negative:1". Un valor no negativo retornaría normalmente sin 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

Explicación de los parámetros y la ejecución:

CheckedAmount recibe amount=-2 como Integer por ByVal. El valor negativo provoca Throw "amount must be non-negative". Catch recibe ese String en problem y lo copia a message; As Exception no crea un objeto. Finally establece finished=1. Main devuelve "amount must be non-negative:1". Un valor no negativo retornaría normalmente sin Catch.

2. Relanzar hacia fuera

# El Throw interno crea "missing item". Catch interno establece trace=1; Throw sin mensaje conserva el mismo error. Finally interno añade 2, Catch externo copia outerProblem a message y añade 3, Finally externo añade 4. Main devuelve "1234:missing item". trace representa el orden de ejecución, no un código de error.
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

Explicación de los parámetros y la ejecución:

El Throw interno crea "missing item". Catch interno establece trace=1; Throw sin mensaje conserva el mismo error. Finally interno añade 2, Catch externo copia outerProblem a message y añade 3, Finally externo añade 4. Main devuelve "1234:missing item". trace representa el orden de ejecución, no un código de error.

3. Finalizar cada iteración iniciada

# number toma 1, 2 y 3. Solo 1 se añade a total: Continue For omite 2, Exit For termina en 3. Los tres Try iniciados ejecutan Finally, por lo que finished=3. Main devuelve 1*10+3=13. Finally no requiere un error; el salto del bucle espera a que termine la finalización de la iteración.
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

Explicación de los parámetros y la ejecución:

number toma 1, 2 y 3. Solo 1 se añade a total: Continue For omite 2, Exit For termina en 3. Los tres Try iniciados ejecutan Finally, por lo que finished=3. Main devuelve 1*10+3=13. Finally no requiere un error; el salto del bucle espera a que termine la finalización de la iteración.


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

Basic