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

Try / Catch / Finally / Throw

ClassicUO • Basic

Try обробляє помилки виконання у своєму тілі та викликаних помічниках. Catch приймає помилку, Finally завершує операцію, Throw створює або повторно викидає помилку. Повернення API-командою 0 чи false є звичайним результатом: перевіряйте його явно; воно саме не викликає Catch.

Точний синтаксис

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

Параметри

  • Try / statements — Try відкриває захищений блок. Потрібен один Catch, один Finally або обидва, а далі End Try. Блоки можна вкладати. Після успішного тіла Catch пропускається. Кілька Catch, фільтри When та Exit Try у цьому піднаборі не реалізовані.
  • Catch / name / As type — Змінну Catch можна не вказувати. Якщо вказано name, вона отримує повідомлення String. As String позначає це подання; As Exception — сумісний запис, а не об’єкт .NET чи фільтр типів. Інші типи заборонено. Нове ім’я стає локальним у процедурі й затінює однойменне глобальне. Наявна локальна змінна отримує значення з дотриманням її типу/Const. Якщо вона потрібна й без виконання Catch, оголосіть String перед Try.
  • Finally / End Try — Finally необов’язковий за наявності Catch; його тіло може бути порожнім. Звичайне завершення, помилки, Return, Exit Sub/Function і переходи циклу/GoTo назовні виконують відповідні Finally. End Try обов’язковий. Скасування скрипта навмисно оминає Catch і скриптовий Finally, щоб аварійну зупинку не можна було затримати.
  • Throw stringExpression — Throw stringExpression один раз обчислює повідомлення й створює нову помилку. Потрібен String; інші значення явно перетворюйте через CStr. Це форма Basic, а не Throw New Exception(...) із VB.NET. Без обробника помилкою завершується поточний запуск, а не всі інші скрипти.
  • Throw — Порожній Throw дозволений лише всередині Catch, зокрема вкладених блоків. Він повторно викидає активну помилку зі збереженням початкового тексту, файла й рядка. Викликаному з Catch помічнику потрібен власний Catch для такого Throw.

Повертає

Try/Catch/Finally і Throw не повертають ID, число чи Boolean. Catch записує повідомлення в name; Throw передає керування замість повернення значення. Приклади явно повертають із Main два результати String та Integer 13. API-методи всередині зберігають власні правила повернення.

Поведінка

  • Підготовка перевіряє вкладеність і забороняє GoTo/On Error GoTo всередину Try, Catch або Finally. Генератор записує адреси обробника й завершення. Кожен виклик має власні активні обробники; помилка потрапляє в найближчий придатний Catch. Помилка всередині Catch проходить через його Finally назовні. Якщо структурного обробника немає, можуть діяти звичайні правила On Error.
  • Очікуваний результат, помилка чи перехід зберігаються на час Finally; вкладене завершення йде зсередини назовні. Нова помилка у Finally замінює попередню. У Basic також дозволені Return і переходи назовні з Finally, які замінюють відкладене продовження; це відрізняється від VB.NET. Порожній Throw зберігає місце першої помилки, зокрема з викликаного помічника.
  • Перевірки паузи/зупинки залишаються активними. Try не створює потоків, повторних спроб чи затримок. Підготовлені адреси використовуються повторно; винятки призначені для помилок, звичайні умови перевіряйте прямо. Аварійна зупинка пропускає скриптове завершення; ресурси хоста мають окремі правила звільнення в рушії.
  • Якщо помилка вийшла з Try після очищення та потрапила до зовнішнього On Error GoTo, Resume повторює весь Try із заголовка. Resume Next продовжує з першого рядка після End Try; On Error Resume Next діє так само. Уже виконані дії можуть повторитися: повернення всередину завершеного тіла немає.

Приклади

1. Перевірити параметр і зберегти повідомлення

# CheckedAmount отримує amount=-2 як Integer через ByVal; від’ємне значення викликає Throw "amount must be non-negative". Catch отримує цей String у problem і копіює в message. As Exception не створює об’єкт. Finally задає finished=1. Main повертає "amount must be non-negative:1". За невід’ємного amount функція повернула б значення без 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

Пояснення параметрів і виконання:

CheckedAmount отримує amount=-2 як Integer через ByVal; від’ємне значення викликає Throw "amount must be non-negative". Catch отримує цей String у problem і копіює в message. As Exception не створює об’єкт. Finally задає finished=1. Main повертає "amount must be non-negative:1". За невід’ємного amount функція повернула б значення без Catch.

2. Передати помилку назовні повторно

# Внутрішній Throw створює "missing item". Внутрішній Catch задає trace=1; порожній Throw зберігає ту саму помилку. Внутрішній Finally дописує 2, зовнішній Catch копіює outerProblem у message й дописує 3, зовнішній Finally дописує 4. Main повертає "1234:missing item". trace показує порядок виконання, а не код помилки.
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

Пояснення параметрів і виконання:

Внутрішній Throw створює "missing item". Внутрішній Catch задає trace=1; порожній Throw зберігає ту саму помилку. Внутрішній Finally дописує 2, зовнішній Catch копіює outerProblem у message й дописує 3, зовнішній Finally дописує 4. Main повертає "1234:missing item". trace показує порядок виконання, а не код помилки.

3. Завершити кожну розпочату ітерацію

# number набуває значень 1, 2, 3. До total додається лише 1: Continue For пропускає 2, Exit For закінчує цикл на 3. У всіх трьох розпочатих Try виконується Finally, тому finished=3. Main повертає 1*10+3=13. Finally не потребує помилки; перехід циклу відкладається до завершення ітерації.
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

Пояснення параметрів і виконання:

number набуває значень 1, 2, 3. До total додається лише 1: Continue For пропускає 2, Exit For закінчує цикл на 3. У всіх трьох розпочатих Try виконується Finally, тому finished=3. Main повертає 1*10+3=13. Finally не потребує помилки; перехід циклу відкладається до завершення ітерації.


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

Basic