在 VB 和 VBA 中,使用 On Error 语句来捕获运行时错误。此语句为系统设置精确的捕获。当错误发生时,此语句会自动转到专门编写的错误处理程序,系统的默认错误处理则被略过。
- On Error Resume Next
- On Error GoTo Label
- On Error GoTo 0
当希望忽略错误时,可以使用 On Error Resume Next 语句。此语句捕获错误但是不会显示错误信息或者终止程序,而是移到下一行代码继续执行。例如,如果希望创建子例程来遍历模型空间并修改每个图元的颜色,则在尝试对锁定图层上的图元着色时,AutoCAD 将会抛出错误。这时不需要终止过程,而只需要跳过锁定图层上的图元并继续处理其余的图元。On Error Resume Next 语句就可以完成这个过程。
当希望编写明确的处理程序时,可以使用 On Error GoTo Label 语句。此语句捕获错误但不会显示错误信息或者终止程序,而是跳到代码中的特定位置。然后代码可以使用适当的方式来响应错误。例如,可以扩充上一个样例,以显示包含锁定图层上每个图元句柄的消息。
以下子例程遍历模型空间,并将每个图元的颜色改为红色。对具有若干图元、有些图元位于锁定图层上的图形运行这个子例程。接着注释掉 On Error Resume Next 语句并再次运行子例程。用户将会看到子例程在遇到锁定图层上的第一个图元时终止。
Sub Ch11_ColorEntities()
Dim entry As Object
On Error Resume Next
For Each entry In ThisDrawing.ModelSpace
entry.Color = acRed
Next entry
End Sub
以下子例程遍历模型空间,并将每个图元的颜色改为红色。对于锁定图层上的每个图元,错误处理程序会显示一条自定义的错误信息和该图元的句柄。对具有若干图元、有些图元位于锁定图层上的图形运行这个子例程。接着注释掉 On Error GoTo MyErrorHandling 语句并再次运行子例程。用户将会看到子例程在遇到锁定图层上的第一个图元时终止。
Sub Ch11_ColorEntities2()
Dim entry As Object
On Error GoTo MyErrorHandler
For Each entry In ThisDrawing.ModelSpace
entry.Color = acRed
Next entry
' 重要信息!在退出错误处理程序之前退出子例程
Exit Sub
MyErrorHandler:
Msgbox entry.EntityName + " is on a locked layer."+ _
" The handle is: " + entry.Handle
Resume Next
End Sub
On Error GoTo 0 语句取消当前的错误处理程序。On Error Resume Next 和 On Error GoTo Label 语句会保持有效,直到子例程结束、声明了其他错误处理程序或者使用 On Error GoTo 0 语句取消错误处理程序为止。