Хорошие шаблоны для обработки ошибок VBA

, чтобы также проверить пустую строку, я предлагаю следовать

<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>

<c:if test="${empty fn:trim(var1)}">

</c:if>

Он также обрабатывает нули

71
задан Atif Aziz 15 April 2013 в 08:22
поделиться

4 ответа

Обработка ошибок в VBA


  • При ошибке Перейти к ErrorHandlerLabel
  • Возобновить ( Далее | ErrorHandlerLabel )
  • При ошибке Перейти к 0 (отключает текущий обработчик ошибок)
  • Объект Err

Свойства объекта Err обычно сбрасываются до нуля или строки нулевой длины в подпрограмме обработки ошибок, но это также можно сделать явно с помощью Err.Clear .

Ошибки в ошибке процедура обработки прекращается.

Диапазон 513-65535 доступен для ошибок пользователя. Для ошибок настраиваемого класса вы добавляете vbObjectError к номеру ошибки. См. Документацию MS о Err.Raise и список номеров ошибок .

Для нереализованных элементов интерфейса в производном классе следует использовать константу E_NOTIMPL = & H80004001 .


Option Explicit

Sub HandleError()
  Dim a As Integer
  On Error GoTo errMyErrorHandler
    a = 7 / 0
  On Error GoTo 0

  Debug.Print "This line won't be executed."

DoCleanUp:
  a = 0
Exit Sub
errMyErrorHandler:
  MsgBox Err.Description, _
    vbExclamation + vbOKCancel, _
    "Error: " & CStr(Err.Number)
Resume DoCleanUp
End Sub

Sub RaiseAndHandleError()
  On Error GoTo errMyErrorHandler
    ' The range 513-65535 is available for user errors.
    ' For class errors, you add vbObjectError to the error number.
    Err.Raise vbObjectError + 513, "Module1::Test()", "My custom error."
  On Error GoTo 0

  Debug.Print "This line will be executed."

Exit Sub
errMyErrorHandler:
  MsgBox Err.Description, _
    vbExclamation + vbOKCancel, _
    "Error: " & CStr(Err.Number)
  Err.Clear
Resume Next
End Sub

Sub FailInErrorHandler()
  Dim a As Integer
  On Error GoTo errMyErrorHandler
    a = 7 / 0
  On Error GoTo 0

  Debug.Print "This line won't be executed."

DoCleanUp:
  a = 0
Exit Sub
errMyErrorHandler:
  a = 7 / 0 ' <== Terminating error!
  MsgBox Err.Description, _
    vbExclamation + vbOKCancel, _
    "Error: " & CStr(Err.Number)
Resume DoCleanUp
End Sub

Sub DontDoThis()

  ' Any error will go unnoticed!
  On Error Resume Next
  ' Some complex code that fails here.
End Sub

Sub DoThisIfYouMust()

  On Error Resume Next
  ' Some code that can fail but you don't care.
  On Error GoTo 0

  ' More code here
End Sub
98
ответ дан 24 November 2019 в 12:54
поделиться

Я бы также добавил:

  • Глобальный объект Err наиболее близок к объекту исключения
  • Вы можете эффективно «выбросить исключение» с помощью Err.Raise

И просто для удовольствия:

  • On Error Resume Next - это воплощение дьявола, которого следует избегать, так как он скрывает ошибки
35
ответ дан 24 November 2019 в 12:54
поделиться

Итак, вы можете сделать что-то вроде этого

Function Errorthingy(pParam)
On Error GoTo HandleErr

 ' your code here

    ExitHere:
    ' your finally code
    Exit Function

    HandleErr:
        Select Case Err.Number
        ' different error handling here'
        Case Else
            MsgBox "Error " & Err.Number & ": " & Err.Description, vbCritical, "ErrorThingy"
        End Select


   Resume ExitHere

End Function

Если вы хотите запекать собственные исключения. (например, те, которые нарушают бизнес-правила), используйте приведенный выше пример, но используйте команду goto для изменения потока метода по мере необходимости.

18
ответ дан 24 November 2019 в 12:54
поделиться

Профессиональная разработка в Excel имеет довольно хорошую схему обработки ошибок . Если вы собираетесь провести какое-то время в VBA, вероятно, стоит приобрести книгу. Есть ряд областей, в которых отсутствует VBA, и в этой книге есть хорошие предложения по управлению этими областями.

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

Процедура точки входа использует операторы On Error для фиксации ошибок в значительной степени, как и было задумано. Процедуры без точки входа возвращают True, если ошибок не было, и False, если ошибки были. Процедуры без точки входа также используют On Error.

4
ответ дан 24 November 2019 в 12:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: