Resume next в обработчике ошибок

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Wasup!
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 120
Зарегистрирован: 21.06.2005 (Вт) 11:09

Resume next в обработчике ошибок

Сообщение Wasup! » 12.09.2006 (Вт) 13:33

Здравствуйте, в одном из топиков http://bbs.vbstreets.ru/viewtopic.php?t ... inary+byte
Уважаемый Andrey Fedorov приводил код сравнивающий два файла:

Код: Выделить всё

Public Sub Main()
    Dim t As Double, b As Boolean
   
    t = Timer
    b = CompFiles("C:\Temp\C1.exe", "C:\Temp\C2.exe")
    MsgBox b & "  Time = " & Format$(Timer - t, "0.0000") & ""
End Sub

Public Function CompFiles(sFile1 As String, sFile2 As String) As Boolean
    Const iStep As Long = 32768
    Dim iHFile1 As String, iHFile2 As String
    Dim m1() As Byte, m2() As Byte, k As Long, j As Long, i As Long
   
    j = iStep - 1
    ReDim m1(j): ReDim m2(j)
    On Error GoTo Err_
    iHFile1 = FreeFile
    Open sFile1 For Binary Access Read As #iHFile1
    iHFile2 = FreeFile
    Open sFile2 For Binary Access Read As #iHFile2
    k = LOF(iHFile1)
    If k = LOF(iHFile2) Then
        Do While k > 0
            j = IIf(k > iStep, iStep, k)
            Get #iHFile1, , m1
            Get #iHFile2, , m2
            For i = 0 To j - 1
                If m1(i) <> m2(i) Then
                    Exit For
                End If
            Next
            If i < j Then Exit Do
            k = k - iStep
        Loop
        CompFiles = (k <= 0)
    End If

Err_:
    If Err.Number Then MsgBox Err.Description
    On Error Resume Next
    If iHFile1 Then Close #iHFile1
    If iHFile2 Then Close #iHFile2
End Function


Вопрос про организацию обработчика ошибок в нем.
Если файл не существует, то Open sFile1 For Binary Access Read As #iHFile1 генерирует ошибку и программа переходит на метку Err_:
Далее идет инструкция On Error Resume Next, которая должна пропускать все последующие ошибки. Но у меня все равно возникает run time error, и программа завершается. То есть on error resume next не срабатывает. И пользователь получает два сообщения об ошибке, вместо одного сообщения и "тихого" закрытия файлов.

Код: Выделить всё

Err_:
    If Err.Number Then MsgBox Err.Description
    On Error Resume Next
    If iHFile1 Then Close #iHFile1
    If iHFile2 Then Close #iHFile2
    msgbox "Если sFile1 не существует, этот код не выполнится"
End Function


Скажите, пожалуйста, можно использовать on error resume next в обработчике ошибок?
Или я что-то совсем не так понял в логике работы

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 12.09.2006 (Вт) 13:36

Можно.
Проверь в настройках среды, какая опция выставлена для отлова ошибок (Trappable Errors).
Lasciate ogni speranza, voi ch'entrate.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 12.09.2006 (Вт) 15:16

Чтобы включить обработчик внутри другого обработчика, нужно написать On Error GoTo -1. Без этого -- не получится.
Изображение

Wasup!
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 120
Зарегистрирован: 21.06.2005 (Вт) 11:09

Сообщение Wasup! » 12.09.2006 (Вт) 15:52

Проверь в настройках среды, какая опция выставлена для отлова ошибок (Trappable Errors).


Результат одинаковый при любом варианте, появляются два сообщения: MsgBox Err.Description и run time error и программа завершается. То же самое при запуске скомпилированного проекта.

Чтобы включить обработчик внутри другого обработчика, нужно написать On Error GoTo -1. Без этого -- не получится.


Так работает. А это документированная возможность или это скрытая функция (фича)?

Serge Gavrilov
Начинающий
Начинающий
 
Сообщения: 19
Зарегистрирован: 26.01.2006 (Чт) 11:35

Сообщение Serge Gavrilov » 12.09.2006 (Вт) 17:55

Wasup! писал(а):
Чтобы включить обработчик внутри другого обработчика, нужно написать On Error GoTo -1. Без этого -- не получится.


Так работает. А это документированная возможность или это скрытая функция (фича)?

Unstructured Exception Handling Overview

В общем-то, On Error GoTo -1 аналогично следующему:
Код: Выделить всё
Resume NextString
NextString:

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 12.09.2006 (Вт) 18:54

Serge Gavrilov писал(а):В общем-то, On Error GoTo -1 аналогично следующему:
Код: Выделить всё
Resume NextString
NextString:

Не совсем. Resume без ошибки вызовет ошибку, а On Error GoTo -1 -- нет.
Изображение

Serge Gavrilov
Начинающий
Начинающий
 
Сообщения: 19
Зарегистрирован: 26.01.2006 (Чт) 11:35

Сообщение Serge Gavrilov » 12.09.2006 (Вт) 21:29

tyomitch писал(а):
Serge Gavrilov писал(а):В общем-то, On Error GoTo -1 аналогично следующему:
Код: Выделить всё
Resume NextString
NextString:

Не совсем. Resume без ошибки вызовет ошибку, а On Error GoTo -1 -- нет.

Да, но речь IMHO шла об использовании именно в обработчике ошибки.

ReMAG
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 54
Зарегистрирован: 02.10.2005 (Вс) 4:01
Откуда: Киев

Сообщение ReMAG » 13.09.2006 (Ср) 10:42

tyomitch писал(а):Чтобы включить обработчик внутри другого обработчика, нужно написать On Error GoTo -1. Без этого -- не получится.


:shock: Опа. А я все время писал On Error Goto 0. Это аналог?
Никогда не говори "никогда"...

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 13.09.2006 (Ср) 10:55

0 - отключение обработки ошибок из основного кода, в обработчике смысловой нагрузки не несет, как и прочие on error (кроме -1).

-1 - отключение признака того, что выполняемый код есть обработчик ошибки, после этого можно пользоваться остальными on error.
Лучший способ понять что-то самому — объяснить это другому.

ReMAG
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 54
Зарегистрирован: 02.10.2005 (Вс) 4:01
Откуда: Киев

Сообщение ReMAG » 13.09.2006 (Ср) 10:59

:shock: :P вот это я задумался... получается имеется ввиду обработчик в обработчике :) пардон
Никогда не говори "никогда"...


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 146

    TopList