Строка, используемая для обработки ошибок, всегда вызывается - PullRequest
0 голосов
/ 18 января 2019

Некоторый контекст в проекте (пропустите это, если вам все равно)

Недавно мне было поручено создать решение, которое позволило бы моим товарищам по команде быстро справиться с тем, что мы называем «Рецепты». К сожалению, нельзя использовать любой другой язык, например Python, поскольку все файлы зашифрованы, если они не открыты в определенных программах. Excel является одним из них, и поэтому весь наш офис склонен использовать VBA для всего. Исходя из буквально всех языков, на которых я когда-либо работал, VBA ... Ужасно разрабатывать сложные проекты (просто мнение), поэтому я рискнул облегчить свою (и моего коллегу) жизнь, создав библиотеку различных типов, функций, классов и т. д.

Проблема

По какой-то причине следующий код всегда будет выполнять alreadyExists Line вместо выполнения только при повышении Error:

Private Sub SetName(index As Integer, name As String)
    On Error GoTo alreadyExists

    If (Not NameExists(name)) Then
        internalName(index) = name
    Else
        Err.Raise 515, "SetName", "Name exists"
    End If

alreadyExists:
    MsgBox ("Name already exists in array.")
    End
End Sub

Другие Subs обрабатывают этот шаблон просто отлично, но этот Sub продолжает работать с ошибкой alreadyExists. Sub, который вызывает это, будет:

Public Sub Insert(data As Variant, Optional name As String)
    Dim i As Integer
    If (Not internalData) = -1 Then
        i = 0
    Else
        i = UBound(internalData) + 1
    End If
    Call ResizeTo(i)

    If name = "" Then
        internalName(i) = i
    Else
        SetName i, name
    End If

    internalData(i) = data
End Sub

Если вам кажется, что весь код необходим, вы можете найти его здесь .

1 Ответ

0 голосов
/ 18 января 2019

Раньше у меня была такая ошибка, вы должны поставить Exit Sub перед обработчиком ошибок, иначе он будет читаться как любая другая часть кода.

Private Sub SetName(index As Integer, name As String)
    On Error GoTo alreadyExists

    If (Not NameExists(name)) Then
        internalName(index) = name
    Else
        Err.Raise 515, "SetName", "Name exists"
    End If

Exit Sub 

alreadyExists:
    MsgBox ("Name already exists in array.")
    End
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...