Vb6 on error resume next

Активизирует подпрограмму обработки ошибок и указывает положение подпрограммы в процедуре; используется также для отключения подпрограммы обработки ошибок.

Активизирует подпрограмму обработки ошибок и указывает положение подпрограммы в процедуре; используется также для отключения подпрограммы обработки ошибок.

  • On Error GoTo строка — Активизирует подпрограмму обработки ошибок, начало которой определяется обязательным аргументом строка, значением которого может быть любая метка строки или номер строки. Если возвращается ошибка выполнения, управление передается на указанную строку и запускается обработчик ошибок. Аргумент строка должен определять строку в той же процедуре, в которой находится инструкция On Error; в противном случае возникает ошибка компиляции.
  • On Error Resume Next — Указывает, что возникновение ошибки выполнения приводит к передаче управления на инструкцию, непосредственно следующую за инструкцией, при выполнении которой возникла ошибка. Рекомендуется при доступе к объектам использовать эту форму инструкции, а не On Error GoTo.
  • On Error GoTo 0 — Отключает любой активизированный обработчик ошибок в текущей процедуре.

Замечания

Если не выполнена инструкция On Error, то любая ошибка выполнения является фатальной; это означает, что выводится сообщение об ошибке и выполнение программы прекращается.

«Включенным» обработчиком ошибок называют подпрограмму, которая указана в инструкции On Error; «активным» обработчиком ошибок является включенный обработчик ошибок, который обрабатывает текущую ошибку. Если ошибка возникает в самом обработчике ошибок (в промежутке между возникновением ошибки и выполнением инструкции Resume, Exit Sub, Exit Function или Exit Property), то обработчик ошибок, определенный в текущей процедуре, не может обработать ошибку. Управление в этом случае возвращается в вызывающую процедуру; если в вызывающей процедуре включен обработчик ошибок, то обработка ошибки передается ему. Если этот обработчик ошибок является в данный момент активным, т.е. уже обрабатывает ошибку, то управление снова передается назад в вызывающую процедуру и т.д. до тех пор, пока не будет найден включенный, но не активный обработчик ошибок. Если включенный, но неактивный обработчик ошибок найден не будет, ошибка становится фатальной в том месте программы, в котором она впервые возникла. При каждой передаче управления обработчиком ошибок в вызывающую процедуру эта процедура становится текущей. После завершения обработки ошибки обработчиком в любой процедуре возобновляется выполнение текущей процедуры с той ее части, которая указана в инструкции Resume.

Подпрограмма обработки ошибок не может быть процедурой Sub или Function. Эта подпрограмма должна быть частью программы, которая отмечается с помощью метки строки или номера строки.

Для определения причины ошибки в подпрограммах обработки ошибок используют значение свойства Number объекта Err. Необходимо обеспечить в подпрограммах обработки ошибок проверку или сохранение существенных значений свойств объекта Err перед тем, как может возникнуть новая ошибка или перед вызовом процедуры, в которой может возникнуть новая ошибка. Значения свойств объекта Err описывают последнюю ошибку. Текст сообщения об ошибке, соответствующего коду ошибки Err.Number содержится в свойстве Err.Description.

Конструкция On Error Resume Next задает продолжение выполнения с инструкции, непосредственно следующей за инструкцией, которая привела к ошибке выполнения, или с инструкции, непосредственно следующей за вызывающей инструкцией в процедуре, содержащей конструкцию On Error Resume Next. Это позволяет продолжить исполнение программы несмотря на ошибку выполнения. Это позволяет также встроить подпрограмму обработки ошибок в процедуру, а не передавать управление в другую часть процедуры. Конструкция On Error Resume Next становится неактивной при вызове новой процедуры, поэтому для внутренней обработки ошибок необходимо выполнять инструкцию On Error Resume Next в каждой вызываемой процедуре.

При обработке ошибок, возникающих при доступе к другим объектам, рекомендуется использовать конструкцию On Error Resume Next, а не конструкцию On Error GoTo. Проверка объекта Err после каждого взаимодействия с другим объектом позволяет устранить неопределенность в том, при доступе к какому объекту возникла ошибка. Это позволяет всегда точно знать, какой объект поместил значение кода ошибки в свойство Err.Number, а также в каком объекте возникла ошибка (эта информация содержится в свойстве Err.Source).

Конструкция On Error GoTo 0 отключает обработку ошибок в текущей процедуре. Эта конструкция не задает переход на строку 0 для обработки ошибок, даже если в процедуре имеется строка с номером 0. Если инструкция On Error GoTo 0 не выполнялась, то обработчик автоматически отключается при выходе из процедуры.

Для того, чтобы предотвратить выполнение программы обработки ошибок в тех случаях, когда ошибка не возникла, следует помещать соответствующую инструкцию Exit Sub, Exit Function или Exit Property сразу после подпрограммы обработки ошибки, как в следующем примере:

Sub InitializeMatrix(Var1, Var2, Var3, Var4)
	On Error GoTo ОбработкаОшибок
	. . .
	Exit Sub
ОбработкаОшибок:
	. . .
	Resume Next
End Sub

В этом примере программа обработки ошибок помещена между инструкциями Exit Sub и End Sub, что позволяет отделить ее от части программы, соответствующей нормальному выполнению процедуры. Программу обработки ошибок можно разместить в любом месте процедуры.

Ошибки, которые не были перехвачены, возвращаются в управляющее приложение, если объект был запущен как исполняемый файл. В среде разработчика такие ошибки возвращаются в управляющее приложение только при указании соответствующих параметров. За описанием необходимых значений этих параметров и способов их задания следует обращаться к документации главного приложения. Там же следует проверить, позволяет ли главное приложение создавать классы.

Err.Number = vbObjectError + 1052

Системные ошибки при вызовах библиотек динамической компоновки (DLL) не приводят к возникновению исключений и не перехватываются средствами Visual Basic. При вызове функций из библиотек DLL необходимо проверять, успешно ли возвращается каждое значение (согласно спецификациям API), и в случае неудачи проверять значение свойства LastDLLError объекта Err.

Пример

В начале этой программы инструкция On Error GoTo определяет положение подпрограммы обработки ошибок в процедуре. В данном примере попытка удалить открытый файл приводит к возникновению ошибки с кодом 55. Ошибка обрабатывается в подпрограмме, после чего управление возвращается инструкции, которая привела к возникновению ошибки. Инструкция On Error GoTo 0 отключает перехват ошибок. После этого инструкция On Error Resume Next задает отложенный перехват ошибок, что позволяет точно определить, в каком контексте возникла ошибка, генерируемая в следующей инструкции. Следует отметить, что после обработки ошибки вызывается метод Err.Clear для сброса значений свойств объекта Err.

Sub OnErrorStatementDemo()
	On Error GoTo ErrorHandler			' Включаем программу обработки 
						' ошибок.
	Open "TESTFILE" For Output As #1		' Открываем файл.
	Kill "TESTFILE"				' Попытка удалить открытый 
						' файл.
	On Error Goto 0				' Отключаем перехват ошибок.
	On Error Resume Next			' Откладываем перехват ошибок.
	ObjectRef = GetObject("MyWord.Basic")	' Запускаем несуществующий 
						' объект, а затем проверяем 
						' ошибку механизма управления 
						' программируемыми объектами.
	If Err.Number = 440 Or Err.Number = 432 Then
	' Выводим сообщение для пользователя и очищаем объект Err.
		Msg = "Ошибка при попытке открыть программируемый объект!"
		MsgBox Msg, , "Проверка отложенной ошибки"
		Err.Clear			' Очищаем поля объекта Err.
	End If	
Exit Sub					' Выходим из процедуры, чтобы
						' не попасть в обработчик.
ErrorHandler:					' Обработчик ошибок.
	Select Case Err.Number			' Определяем код ошибки.

Case 55						' "Ошибка "Файл уже открыт".
			Close #1		' Закрываем открытый файл.
		Case Else
	' Здесь размещаются инструкции для обработки других ошибок... 
	End Select
	Resume					' Возобновляем выполнение
						' со строки, вызвавшей ошибку.
End Sub
  • Home
  • VBForums
  • Visual Basic
  • Visual Basic 6 and Earlier
  • On Error Resume Next

  1. Feb 12th, 2015, 07:45 PM


    #1

    Help321 is offline

    Thread Starter


    Hyperactive Member


    Resolved On Error Resume Next

    Hi

    I’ve just inherited some VB6 code, simplified version below, shows the problem:

    Code:

    Private Sub Command1_Click()
        On Error GoTo ErrorTrap
        
        Dim i As Integer
        
        i = "aaa"
        
        Exit Sub
    ErrorTrap:
        On Error Resume Next
    
        i = "aaa"
    End Sub

    So the errortrap kicks in at the first problem line — i = «aaa». But then I get an unhandled error when it runs that line in the error trap.

    I can fix it as the ‘On Error Resume Next’ is there due to lazy programming. But why is it not ignoring errors at that point with the ‘On Error Resume Next’?

    Cheers

    Last edited by Help321; Feb 13th, 2015 at 09:52 PM.

    Why do today what you can tomorrow…


  2. Feb 12th, 2015, 07:48 PM


    #2

    Re: On Error Resume Next

    Because you have an error within an error trap

    Last edited by jmsrickland; Feb 12th, 2015 at 07:56 PM.

    Anything I post is an example only and is not intended to be the only solution, the total solution nor the final solution to your request nor do I claim that it is. If you find it useful then it is entirely up to you to make whatever changes necessary you feel are adequate for your purposes.


  3. Feb 12th, 2015, 08:02 PM


    #3

    Help321 is offline

    Thread Starter


    Hyperactive Member


    Re: On Error Resume Next

    Thanks, so is there no way of ignoring errors within an error trap or handling them then?

    Why do today what you can tomorrow…


  4. Feb 12th, 2015, 08:06 PM


    #4

    Re: On Error Resume Next

    What do you want to happen? There just isn’t any meaningful way to stuff «aaa» into an Integer.


  5. Feb 12th, 2015, 08:11 PM


    #5

    Help321 is offline

    Thread Starter


    Hyperactive Member


    Re: On Error Resume Next

    I realise that, it’s an example to ask why on error resume next does not work in an error trap.

    Say I’m writing to a file. An error occurs, it jumps to the error trap. In the error trap I want to delete any partially created file. So I delete it. It can’t be deleted as the file is in use, it’s read only, the network is down, anything. How do I handle that error if I can’t trap it?

    Why do today what you can tomorrow…


  6. Feb 12th, 2015, 08:55 PM


    #6

    BruceR is offline


    Addicted Member


    Re: On Error Resume Next

    You have a recursive call to the error handler. What you want is this:

    Code:

    Private Sub Command1_Click()
        On Error Resume Next
        
        Dim i As Integer
        
        i = "aaa"
        
      
        i = "aaa"
    
    End Sub


  7. Feb 12th, 2015, 09:14 PM


    #7

    Help321 is offline

    Thread Starter


    Hyperactive Member


    Re: On Error Resume Next

    I’m obviously not explaining this very well sorry. The actual problem is fixed, but I’m still interested in why ON ERROR RESUME NEXT does not work when placed in an ERROR TRAP.

    How about this maybe better ‘real world’ example:

    Code:

    Private Sub Command_Click()
        On Error GoTo ErrorTrap
        
        Dim i As Integer
    
        If Dir("C:Example.txt", vbNormal) <> "" Then
            Kill "C:Example.txt"
        End If
    
        Open "C:Example.txt" For Append As #1
        Print #1, "This is an exmaple"
        'This is an example or an error
        i = "AAA"
        Close #1
            
        Exit Sub
    ErrorTrap:
        On Error Resume Next
    
        Close #1
        If Dir("C:Example.txt", vbNormal) <> "" Then
            Kill "C:Example.txt"
        End If
    End Sub

    The I = «AAA» is just an example, I don’t want to do that. It’s an easy error to show here. So it goes to the ErrorTrap. Lets say it’s about to delete the file with the line underlined and bold.

    Lets say you don’t really care if the file is deleted on not as it’s deleted the next time the sub runs.

    Now as the line of code Kill «C:Example.txt» is executed, the network goes down, or something else deletes that file, so it no longer exists. We don’t care, we want to resume next. How do you do it?

    Why do today what you can tomorrow…


  8. Feb 12th, 2015, 10:54 PM


    #8

    Re: On Error Resume Next

    You could try something like this

    Code:

    Exit Sub
    CleanUp:
     On Error Resume Next
        Close #1
        If Dir("C:Example.txt", vbNormal) <> "" Then
            Kill "C:Example.txt"
        End If
        Exit Sub
    ErrorTrap:
       Resume Cleanup
    End Sub


  9. Feb 12th, 2015, 11:02 PM


    #9

    Help321 is offline

    Thread Starter


    Hyperactive Member


    Re: On Error Resume Next

    Thanks DataMiser. That’s a good way of achieving it. I’ve not needed to do this, except to correct the lazy code I got. Which basically tried to close an open file, which may not have been open. It tried to ignore the error with ‘On Error Resume Next’.

    Why does ‘On Error Resume Next’ work in ‘CleanUp’ yet doesn’t work in the example above when it’s in ErrorTrap? Or is that just the way it works?

    Why do today what you can tomorrow…


  10. Feb 12th, 2015, 11:30 PM


    #10

    Re: On Error Resume Next

    Because of the Resume … not the On Error Resume Next, but the Resume Cleanup … Resume exits out of the error handler, which allows a resetting of error handling.

    -tg


  11. Feb 13th, 2015, 01:36 AM


    #11

    Re: On Error Resume Next

    Quote Originally Posted by Help321

    But why is it not ignoring errors at that point with the ‘On Error Resume Next’?

    … so is there no way of ignoring errors within an error trap or handling them then?

    … it’s an example to ask why on error resume next does not work in an error trap.

    How do I handle that error if I can’t trap it?

    The actual problem is fixed, but I’m still interested in why ON ERROR RESUME NEXT does not work when placed in an ERROR TRAP.

    Why does ‘On Error Resume Next’ work in ‘CleanUp’ yet doesn’t work in the example above when it’s in ErrorTrap? Or is that just the way it works?

    According to the On Error Statement:

    Quote Originally Posted by MSDN

    An «enabled» error handler is one that is turned on by an On Error statement; an «active» error handler is an enabled handler that is in the process of handling an error. If an error occurs while an error handler is active (between the occurrence of the error and a Resume, Exit Sub, Exit Function, or Exit Property statement), the current procedure’s error handler can’t handle the error. Control returns to the calling procedure. If the calling procedure has an enabled error handler, it is activated to handle the error. If the calling procedure’s error handler is also active, control passes back through previous calling procedures until an enabled, but inactive, error handler is found. If no inactive, enabled error handler is found, the error is fatal at the point at which it actually occurred. Each time the error handler passes control back to a calling procedure, that procedure becomes the current procedure. Once an error is handled by an error handler in any procedure, execution resumes in the current procedure at the point designated by the Resume statement.

    Note An error-handling routine is not a Sub procedure or Function procedure. It is a section of code marked by a line label or line number.

    On Local Error Resume Next: If Not Empty Is Nothing Then Do While Null: ReDim i(True To False) As Currency: Loop: Else Debug.Assert CCur(CLng(CInt(CBool(False Imp True Xor False Eqv True)))): Stop: On Local Error GoTo 0
    Declare Sub CrashVB Lib «msvbvm60» (Optional DontPassMe As Any)


  12. Feb 13th, 2015, 05:45 AM


    #12

    Re: On Error Resume Next

    If I understand you correctly …

    Code:

    Option Explicit
    
    Private Sub Command1_Click()
        On Error GoTo ErrorTrap
        
        Dim i As Integer
        
        i = "aaa"
        
        Exit Sub
    ErrorTrap:
        On Error GoTo -1
        On Error Resume Next
    
        i = "aaa"
    
    End Sub


  13. Feb 13th, 2015, 06:20 AM


    #13

    Re: On Error Resume Next

    Because of the Resume … not the On Error Resume Next, but the Resume Cleanup … Resume exits out of the error handler, which allows a resetting of error handling.

    Yep there is your answer.

    OERN turns off error handling, it just the wrong thing to be using in your example. Also it does nothing in an error trap as the error has already been trapped, you have to exit your error handler for it to be able to handle another error.

    DataMisers code does this — If your sub errors;

    — enters errorTrap which handles error in your main sub,
    — then exits your error trap and goes to CleanUp.
    — In Cleanup OERN turns off Error Handling completely
    — Kills the file, but if it cant throws NO error just continues and exits sub.


  14. Feb 13th, 2015, 07:51 AM


    #14

    BruceR is offline


    Addicted Member


    Re: On Error Resume Next

    As stated in post #6, you were trying to make recursive calls to an error handeler. You cannot set a handeler from within an active handeler. I hope this is clear now. All the other posters are correct. The handeler must be completed before setting a new handeler.


  15. Feb 13th, 2015, 09:51 PM


    #15

    Help321 is offline

    Thread Starter


    Hyperactive Member


    Re: On Error Resume Next

    Thanks everyone.

    BruceR your post #6 doesn’t provide an answer as it’s not going to an error trap. So it wasn’t what I wanted and so it wasn’t clear at that point.

    Why do today what you can tomorrow…


  16. Feb 13th, 2015, 10:44 PM


    #16

    Re: On Error Resume Next

    Quote Originally Posted by Help321
    View Post

    I’m obviously not explaining this very well sorry. The actual problem is fixed, but I’m still interested in why ON ERROR RESUME NEXT does not work when placed in an ERROR TRAP.

    Because «it’s how it is»… Bonnie posted already a Docu-snippet, which describes that…

    Quote Originally Posted by Help321
    View Post

    How about this maybe better ‘real world’ example:

    Code:

    Private Sub Command_Click()
        On Error GoTo ErrorTrap
        
        Dim i As Integer
    
        If Dir("C:Example.txt", vbNormal) <> "" Then
            Kill "C:Example.txt"
        End If
    
        Open "C:Example.txt" For Append As #1
        Print #1, "This is an exmaple"
        'This is an example or an error
        i = "AAA"
        Close #1
            
        Exit Sub
    ErrorTrap:
        On Error Resume Next
    
        Close #1
        If Dir("C:Example.txt", vbNormal) <> "" Then
            Kill "C:Example.txt"
        End If
    End Sub

    For stuff like the above, where you need more influence on the Error-behaviour —
    and have several «ideas», how to handle possible error-cases with «other attempts»,
    I use In-Place-Error-Handling per On Error Resume Next… as e.g.:

    Code:

    Private Sub Command_Click()
    Dim i As Integer
        
        If Dir("C:Example.txt", vbNormal) = "" Then Err.Raise vbObjectError, , "File not found"
    
        On Error Resume Next
            Kill "C:Example.txt"
        If Err Then 
            'handle or report the FileDelete-Error
            Err.Clear '<- in case you want to continue, clear the Error first
        End If
     
        Open "C:Example.txt" For Append As #1
        If Err Then 
            Close #1
            Kill "C:Example.txt"
            'handle or report the Open-Error
            Err.Clear '<- in case you want to continue, clear the Error first
        End If
     
        Print #1, "This is an exmaple"
        If Err Then 
            Close #1
            Kill "C:Example.txt"
            'handle or report the Print-Error
            Err.Clear '<- in case you want to continue, clear the Error first
        End If
    
        
        i = "AAA"
        If Err Then 
            Close #1
            Kill "C:Example.txt"
            'handle or report the Assignment-Error
            Err.Clear '<- in case you want to continue, clear the Error first
        End If
        Close #1
        
    End Sub

    Just the principle — and there’s things like Helper-Functions of course,
    which would make the whole thing more readable…

    Code:

    Option Explicit
    
    Private Sub Form_Click()
    Dim FileName As String, FNr As Long, i As Integer
     
        On Error Resume Next
        
        FileName = "C:Example.txt"
    
        If FileExists(FileName) Then Kill FileName
        If Err Then HandleFileErrors "Kill-Attempt in Form_Click", Err
     
        FNr = FreeFile
        Open FileName For Append As #FNr
        If Err Then HandleFileErrors "Open-Attempt in Form_Click", Err, FNr, FileName
     
        Print #FNr, "This is an exmaple"
        If Err Then HandleFileErrors "Print-Attempt in Form_Click", Err, FNr, FileName
     
        i = "AAA"
        If Err Then HandleFileErrors "Assign-Attempt in Form_Click", Err, FNr, FileName
        
        Close FNr
    End Sub
     
    Public Function FileExists(ByVal FileName As String) As Boolean
    On Error GoTo ExitWithFalse
      FileExists = (GetAttr(FileName) And vbDirectory) = 0
    ExitWithFalse:
    End Function
    
    Public Sub HandleFileErrors(ErrText, Err As ErrObject, _
                                Optional ByVal FileHandleToClose&, _
                                Optional FileNameToKill As String)
      If FileHandleToClose Then Close FileHandleToClose
      If Len(FileNameToKill) Then Kill FileNameToKill
      MsgBox Err.Source & vbLf & ErrText & vbLf & Err.Description: Err.Clear
    End Sub

    Olaf

    Last edited by Schmidt; Feb 14th, 2015 at 02:05 AM.


  17. Feb 14th, 2015, 12:15 PM


    #17

    Re: On Error Resume Next

    You can modify original code like this

    Code:

    Private Sub Command1_Click()
        On Error GoTo ErrorTrap
        
        Dim i As Integer
        
        i = "aaa"
        
        Exit Sub
    ErrorTrap:
        Resume NextLine      '--- add 
    NextLine:                '--- add
        On Error Resume Next
    
        i = "aaa"
    End Sub

    … to get expected behavior is error handler.

    cheers,
    </wqw>


  • Home
  • VBForums
  • Visual Basic
  • Visual Basic 6 and Earlier
  • On Error Resume Next


Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •  
  • BB code is On
  • Smilies are On
  • [IMG] code is On
  • [VIDEO] code is On
  • HTML code is Off

Forum Rules


Click Here to Expand Forum to Full Width

На чтение 7 мин Просмотров 339 Опубликовано 16.12.2014

В этой статье мы рассмотри обработку ошибок в языке VBScript, а именно объектErr, конструкцию On Error Resume Next и On Error Goto 0. Конструкция VBScript On Error Resume Next включает обработку ошибок, а On Error Goto 0 отменяет их обработку.

Объект Err не нуждается в предварительном объявлении, и доступен всегда, давайте рассмотри его методы и свойства:

  • Description — данное свойство содержит описание ошибки.
  • Number — содержит целое число – номер ошибки. Если значение свойства Number ровно нулю – значит, ошибка отсутствует.
  • Source — свойство содержит название приложения, в котором возникла ошибка.

Методы

Clear – полная очистка информации об ошибке. Стоит обратить внимание, что информация об ошибке автоматически очищается при выполнении операторов On Error Resume Next, Exit Sub и Exit Function.

Raise(number, [source, description]) – данный метод позволяет генерировать собственную ошибку времени выполнения. Видим, что тут можно задать параметры, аналогичные по своей принадлежности свойствам самого объекта Err. Видим, что тут является обязательным только первый параметр.

Хорошо, теперь давайте рассмотри четыре примера на языке vbscript.

Пример 1

'------------------------------------------------------------------------------' vbscript on error resume next' произойдет вычисление только для первых 3 значений' on_error_1.vbs'------------------------------------------------------------------------------ OptionExplicit 'включаем обработку ошибокOnErrorResumeNext dim MyArr(8), icount, Result, msgErr, msg  ' заполняем массив MyArr(0) = 5 MyArr(1) = -3 MyArr(2) = 15 MyArr(3) = 0 MyArr(4) = 2 MyArr(5) = 6 MyArr(6) = 0 MyArr(7) = -1  icount=0msg=""msgErr = "Ошибка!!!" & vbCrLf 'циклично делим число 15 на каждый элемент массиваDo result=15/MyArr(icount) If Err.Number <> 0 ThenmsgErr=msgErr & "Код ошибки: " & Err.Number & vbCrLf &_ "Описание: " & Err.Description & vbCrLf &_ "Приложение: " & Err.Source & vbCrLf result = msgErr msgErr=""endif icount = icount+1 msg=msg & Result & vbCrLf & vbCrLfLoopWhile (icount <8) MsgBox msg

В данном примере мы создали массив из 8 элементов, каждый из которых является числом, два элемента – являются нулями. В цикле do…loop (работа данного цикла рассмотрена в статье Урок 7 по VBScript: Циклы do…loop и while…wend) идет деление числа 15 на каждый элемент массива (Урок 9 по VBScript: Массивы). Так как мы не включили в данном примере очистку информации об ошибке, то произойдёт деление только первых трёх значений, а всё остальное будет принято за ошибку.

Пример 2

'------------------------------------------------------------------------------' vbscript on error resume next' Вычисления не произойдут' on_error_2.vbs'------------------------------------------------------------------------------ OptionExplicit 'включаем обработку ошибокOnErrorResumeNext dim MyArr(8), icount, Result, msgErr, msg  ' заполняем массив MyArr(0) = 5 MyArr(1) = -3 MyArr(2) = 15 MyArr(3) = 0 MyArr(4) = 2 MyArr(5) = 6 MyArr(6) = 0 MyArr(7) = -1  icount=0msg=""msgErr = "Ошибка!!!" & vbCrLf 'циклично делим число 15 на каждый элемент массиваDo result=15/MyArr(icount) If Err.Number <> 0 ThenmsgErr=msgErr + "Код ошибки: " & Err.Number & vbCrLf &_ "Описание: " & Err.Description & vbCrLf &_ "Приложение: " & Err.Source & vbCrLf result = msgErr msgErr=""' Отменяем обработку ошибок!!!OnErrorGoto 0 endif icount = icount+1 msg=msg & result & vbCrLf & vbCrLfLoopWhile (icount <8) MsgBox msg

Тут мы дополнительно использовали конструкцию On Error Goto 0, которая отключает обработку ошибок. Это приведёт к тому, что никакие вычисления не будут произведены, и при запуске сценария автоматически произойдёт ошибка времени выполнения.

Скачать архив с примерами

Пример 3

'------------------------------------------------------------------------------' on error resume next vbscript' Правильный подход обработки ошибок' on_error_3.vbs'------------------------------------------------------------------------------ OptionExplicit 'включаем обработку ошибокOnErrorResumeNext dim MyArr(8), icount, Result, msgErr, msg  ' заполняем массив MyArr(0) = 5 MyArr(1) = -3 MyArr(2) = 15 MyArr(3) = 0 MyArr(4) = 2 MyArr(5) = 6 MyArr(6) = 0 MyArr(7) = -1  icount=0msg=""msgErr = "Ошибка!!!" & vbCrLf 'циклично делим число 15 на каждый элемент массиваDo'Очищаем информацию об ошибке Err.Clear  result=15/MyArr(icount) If Err.Number <> 0 ThenmsgErr=msgErr + "Код ошибки: " & Err.Number & vbCrLf &_ "Описание: " & Err.Description & vbCrLf &_ "Приложение: " & Err.Source & vbCrLf result = msgErr msgErr=""endif icount = icount+1 msg=msg & result & vbCrLf & vbCrLfLoopWhile (icount <8) MsgBox msg

В этом примере мы сделали все правильно, так как вначале цикла прописали Err.Clear, который очищает информацию о предыдущих ошибках.

Ну и наконец четвертый пример, тут мы генерируем собственное описание ошибки.

Пример 4

'------------------------------------------------------------------------------' on error resume next vbscript' генерация собственной ошибки' on_error_4.vbs'------------------------------------------------------------------------------ OptionExplicit 'включаем обработку ошибокOnErrorResumeNext dim MyArr(8), icount, Result, msgErr, msg  ' заполняем массив MyArr(0) = 5 MyArr(1) = -3 MyArr(2) = 15 MyArr(3) = 0 MyArr(4) = 2 MyArr(5) = 6 MyArr(6) = 0 MyArr(7) = -1  icount=0msg=""msgErr = "Ошибка!!!" & vbCrLf 'циклично делим число 15 на каждый элемент массиваDo'Очищаем информацию об ошибке Err.Clear result=15/MyArr(icount) If Err.Number <> 0 ThenErr.Raise 100, "текущий сценарий", "пробуем делить на ноль" msgErr=msgErr + "Код ошибки: " & Err.Number & vbCrLf &_ "Описание: " & Err.Description & vbCrLf &_ "Приложение: " & Err.Source & vbCrLf result = msgErr msgErr=""endif icount = icount+1 msg=msg & result & vbCrLf & vbCrLfLoopWhile (icount <8) MsgBox msg

Давайте подытожим сказанной в данной статье…. Должен сказать, что материал получился довольно сухим на предмет обзора, это и не удивительно — большую часть занимают примеры программного кода. В целом, мы рассмотрели внутренний объект Err, который содержит методы и свойства для обработки исключительных ситуаций в сценариях на языке VBSCRIPT.

Обработка ошибок времени выполнения

При обнаружении ошибки времени выполнения
Visual Basic выводит сообщение об ошибке и
приостанавливает выполнение программы.
Однако Visual Basic предоставляет пользователю
средства, с помощью которых он может
поручить программе выполнить перехват
ошибки и определить дальнейшие действия.
Обработка ошибок — это задание реакции
на ошибки, которые возникают во время
выполнения программы.

Обработка ошибок
производится в три этапа:

  • Подготовка
    перехвата
    .
    Выполняется с помощью оператора On
    Error
    . Оператор
    On Error
    активизирует режим обработки ошибок.
    Это означает, что при возникновении
    ошибки выполнения программа не
    прерывается и стандартное сообщение
    об ошибке не выводится. Оператор On
    Error
    осуществляет
    передачу управления на подпрограмму
    обработки ошибок, которая может выдавать
    сообщение и продолжать работу программы.
    Возможны три варианта синтаксиса
    оператора:

On Error GoTo метка

передача
управления на подпрограмму,
идентифицирующуюся меткой;

On Error Resume Next —

ошибка
игнорируется и управление передается
следующему оператору за тем, при
выполнении которого возникла ошибка;

On Error GoTo 0 —

отключает
предусмотренную пользователем
процедуру обработки ошибок и включает
стандартный механизм.

Для
перехвата всех возможных ошибок оператор
On Error должен
находится в начале процедуры.

  • Проверка
    и устранение ошибки.
    Это
    этап обработки ошибки, на котором
    возникшая ошибка анализируется, и
    выполняются соответствующие действия.
    Установить тип ошибки можно с помощью
    объекта Err.
    Свойства объекта Err
    позволяют
    получить следующую информацию о
    последней ошибке выполнения: свойство
    Number
    — номер
    возникшей ошибки;

свойство
Source
— имя
проекта, в котором возникла ошибка;

свойство
Description

строка с описанием ошибки;

свойство
HelpFile
— полное
имя файла справки.

После
того как обнаруженная ошибка обработана,
в процедуре нужно предусмотреть очистку
свойств объекта Err.
Очищает значения всех свойств объекта
Err метод
Clear.

Все
ошибки выполнения можно разделить на
две группы: ожидаемые, обработка которых
может быть предусмотрена заранее при
разработке программы и неожиданные.
Если ожидаемые ошибки известны заранее,
то целесообразно создать единый для
всех процедур модуля обработчик ошибок
в виде процедуры. Параметром такой
процедуры должен быть код ошибки.

  • Продолжение
    выполнения программы
    .
    Выполняется с помощью оператора Resume.
    Оператор Resume
    передает управление из обработчика
    ошибок в программу. Возможны следующие
    варианты синтаксиса оператора:

Resume [0] —

повторное
выполнение оператора, вызвавшего
ошибку;

Resume Next —

выполнение
следующего оператора за тем, при
выполнении которого возникла ошибка;

Resume метка —

выполнение
оператора, помеченного меткой.

Средства обнаружения логических ошибок

В
Visual Basic для обнаружения логических
ошибок имеются следующие средства
отладки программ:

  • точка
    останова
    .
    Точка останова — это специальная
    инструкция в процедуре, на которой
    работа процедуры приостанавливается;

  • трассировка
    процедур.
    Трассировка — это пошаговое (пооператорное)
    выполнение процедуры, позволяющее
    контролировать правильность выполнения
    алгоритма процедуры;

  • отслеживание
    в диалоговых окна Locals,
    Quick
    Watch
    и Watches
    значений
    переменных, выражений, свойств объектов
    ,
    возможность изменения этих значений
    в окне Watches.

В Visual Basic имеется
три режима работы с программой:

  • режим
    работы с текстом программы в редакторе
    кода;

  • режим выполнения,
    в котором текст программы не доступен
    для изменения, его можно только
    просматривать в окне редактора кода;

  • режим
    прерывания (режим отладки), когда
    осуществляется приостановка работы
    программы. Режим позволяет просматривать
    значения переменных, продолжать или
    прекращать работу программы, вносить
    изменения в текст программы.

Кнопки
команд, реализующих средства отладки
расположены на панели инструментов
Debug(отладка).
Команды отладки доступны также из меню
Debug.
Кроме этого выполнить эти команды можно
из контекстного меню вызванного в окне
редактора кода.

Панель
инструментов Debug:

Start/Continue

(Продолжить)

Запускает
программу или продолжает ее выполнение
после прерывания

Break

(Прервать)

Вызывает прерывание
программы в нужном месте

End

(Сброс)

Завершает выполнение программы

Togge Breakpoint

(Точка
останова)

Устанавливает
/ удаляет в текущей строке точку
останова

Step Into

(Шаг
с заходом)

Осуществляет
пошаговое выполнение процедуры с
трассировкой вызываемых ею процедур

Step Over

(Шаг
с обходом)

Осуществляет
пошаговое выполнение процедуры без
трассировки вызываемых ею процедур

Step Out

(Шаг
с выходом)

Выполняет
оставшуюся часть процедуры и
останавливается на следующим после
вызова процедуры операторе

Locals Window

(Окно
Locals)

Открывает
окно Locals
(локальные)
с текущими значениями всех локальных
переменных процедуры

Immediate Window

(Окно
Immediate)

Открывает
окно
Immediate
(непосредственное
выполнение), в котором можно выполнить
нужные операторы

Watch Window

(Окно
Watch)

Открывает
окно Watch
(наблюдение),
в котором можно просматривать текущие
значения переменных, выражений

Quick Watch

(Быстрый
просмотр)

Открывает
окно Quick
Watch
для
просмотра текущего значения выражения
или переменной, в момент останова
работы процедуры

Call Stack

(Стек
вызова)

В
режиме прерывания открывает диалоговое
окно Call
Stack
со
списком всех выполняемых процедур

Точка
останова.
Точки
останова устанавливаются в том случае
когда:

  • требуется остановить
    выполнения программы в нужном месте и
    проанализировать значение переменных;

  • нужно
    выполнить трассировку фрагмента
    процедуры, для проверки работы алгоритма
    (устанавливается две точки в начало и
    конец фрагмента процедуры) и т.д.

Установить
точку останова можно командой или
указателем мыши, щелкнув по полосе
индикатора. Полоса индикатора расположена
слева от текста процедуры в окне редактора
кода и выделена серым цветом. Для
отображения полосы индикатора следует
установить опцию Margin
Indicator Bar
на
вкладке Editor
Format
в окне
команды
ToolsOptions.

Установленные в
среде разработки точки останова не
сохраняются вместе с программой и не
включаются в exe-файл при его создании.

Удаление
точки останова осуществляется повторным
выполнением команды
Togge Breakpoint.
Несколько
точек останова модно удалить одновременно
командой Clear
All Breakpoints
меню
Debug.

Можно
остановить выполнение программы в
нужном месте, не используя точку останова.
Для этого следует установить курсор в
ту строку, до которой должна выполняться
программа, и выбрать команду Run
To Cursor
меню
Debug.

Трассировка
процедур.

Выполняется в режиме отладки программы
и позволяет наблюдать за результатами
выполнения каждой строки программы.
Является важным средством поиска ошибок
и отладки программ. Трассировку можно
выполнить с помощью команд
Step Into
, Step
Over
и Step Out.
Друг от друга команды отличаются
правилами работы с вызываемыми
процедурами.

Если
трассировка программы выполняется
командой Step
Into
(шаг с
заходом), то при выполнении оператора
вызова процедуры (функции) осуществляется
переход в процедуру (функцию) и последующее
выполнение команды Step
Into
приводит
к трассировке процедуры.

В
отличие от команды Step
Into
, команда
Step Over
(шаг с обходом)
выполняет вызов процедуры (функции)
как единичный оператор, те есть без
захода в процедуру (функцию).

В
том случае, когда требуется пошаговое
выполнение части процедуры до заданного
оператора, следует воспользоваться
двумя операторами Step
Into
и Step
Out
(шаг с
выходом).
До заданного оператора трассировка
должна выполняться командой Step
Into
. Когда
маркер помечает этот оператор, следует
выполнить командуй Step
Out.
Команда Step
Out
выполнить оставшуюся часть процедуры
и возвратиться в точку вызова.

Просмотр
значений.

Выполняется в режиме отладки и позволяет
контролировать значения переменных и
выражений в процессе выполнения
программы. Visual Basic предоставляет для
этого следующие средства:

  • Окно
    Data Tips.
    В окне Data
    Tips
    отображается
    значение той переменной, на которую
    установлен указатель мыши. Установить
    средство Auto
    Data Tips
    можно
    в окне команды ToolsOptions
    на вкладке Editor.

  • Окно
    Quick
    Watch.
    В окне Quick
    Watch
    можно также просмотреть значение одной
    выбранной переменной (курсор должен
    находится на имени переменной). Из окна
    Quick
    Watch
    можно выполнить добавление переменной
    в окно просмотра Watches
    (кнопка Add).
    Окно Quick
    Watch
    открывается командой Quick
    Watch
    меню Debug
    или кнопкой

    (Quick
    Watch)
    на панели Debug.

  • Окно
    Watches.
    В окне Wanches
    отображаются контролируемые выражения
    и их значения. Окно Wanches
    открывается кнопкой

    Watch
    Window
    панели Debug
    или командой Watch
    Window
    меню View.

Добавить
выражение в окно можно:

  • из
    окна команды Quick
    Watch
    кнопкой Add;

  • командой
    Add
    Watch
    меню Debug;

  • перетаскиванием
    выражения из окна редактора кода в окно
    Wanches.

  • Выражение
    в окне Wanches
    можно не только просматривать, но и
    редактировать. Можно изменить также и
    текущее значение выражения. Для этого
    достаточно в окне Wanches
    щелкнуть мышью на изменяемом выражении
    или значении.

  • Окно
    Locals.
    Это окно отображает все локальные
    переменные выполняемой процедуры и их
    значения в режиме отладки автоматически.
    Окно Locals
    открывается кнопкой

    Locals
    Window
    меню View.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]

  • #
  • #
  • #
  • #
  • #
  • #
  • #
  • #
  • #
  • #
  • #

Понравилась статья? Поделить с друзьями:
  • Vb6 on error goto
  • Vb6 error accessing system registry
  • Vb net on error resume next
  • Vaux com interface communication error or interface not powered from car
  • Vat2000 коды ошибок