2011-05-27 23 views
5

我从SO复制一段代码作为例子。子例程包含一个错误处理程序。应该为所有Subs制作一个错误处理程序吗?我们是否需要为每个子例程创建一个错误处理程序?

Public Sub SubA() 
    On Error Goto ProcError 

    Connection.Open 
    Open File for Writing 
    SomePreciousResource.GrabIt 

ProcExit: 
    Connection.Close 
    Connection = Nothing 
    Close File 
    SomePreciousResource.Release 

    Exit Sub 

ProcError: 
    MsgBox Err.Description 
    Resume ProcExit 
End Sub 

顺便说一下,如何做一个子程序内部的控制流时,代码执行遇到Exit SubEnd SubResume?在执行过程中遇到诸如ProcError:这样的标签时,它是执行它还是跳过它?

回答

2

退出小组将退出子程序立刻像Java中返回

结束子只是对于像的子程序块的末尾中的Java

标记}标签是简单地在代码的标记这是用来定义一个跳转目标。如果您没有跳转到标签但是“定期”到达那里,标签本身将被忽略,但标签后面的代码将被执行,就好像没有标签一样,您示例中的代码将一直执行到只要没有错误发生,就退出Sub语句。如果一个occures它会跳到ProcError

简历会在这种情况下执行ProcExit看到更多here

+0

你说标签块将被忽略,但它是如何识别块并将其与代码的其余部分分开? – lamwaiman1988 2011-05-27 07:53:13

+1

@ gunbuster363:我认为@ cmmi的声明是正确的,虽然不是很清楚。 “标签将被忽略”的含义是:标签本身在执行时不执行任何操作。但是,标签之后的代码(你称之为“标签块”)肯定不会被忽略并且会被执行。 – 2011-05-27 08:07:13

+0

我想我现在明白了。 – lamwaiman1988 2011-05-27 08:10:04

9

简短的回答是:不,你不仅不需要有错误处理程序中的每个程序,但实际上你通常不会在每个过程中出现想要错误处理程序。

你会想要做错误处理,最有意义的地方去做。通常情况下,您只需要最高级过程中的错误处理程序,即调用所有其他程序的错误处理程序;较低层次的程序应该在楼上解决问题,并让错误“冒泡”到更高层次的程序。有时你会想在低级过程中进行一些错误处理。

如需更多信息,请您看看这两个优秀的答案被@jtolle:

此外,互联网搜索,就会发现有一个整体上的文献该网页关于错误处理。在我看来,它有些是错误的!但如果它坚持我在前两段中写的内容,那么值得考虑。

Exit SubEnd Sub相当直观:前者停止执行当前Sub并将控制返回给调用它的过程(或者如果过程未被另一过程调用,则完全停止执行)。后者只是向编译器指示此处特定Sub的代码结束的位置 - 如果执行,则End Sub的行为与Exit Sub的行为相同。

Resume指定在错误处理例程完成后接下来应该发生什么。原始Resume返回到导致错误的同一语句并尝试再次执行它。 Resume Next跳过导致错误的语句,而是跳转到紧跟其后的语句。 Resume mylabel转到标签mylabel:

如果在执行过程中遇到ProcError:等标签,则不会发生任何特殊情况,并且执行会转到标签后面的下一个语句。当然,在你的例子中,ProcError:将永远不会被直接执行(即除非产生错误),因为在它之前有Exit Sub


顺便说一句,在ProcExit:块也许应该有On Error Resume Next开始(即保持在关闭的一切,无论任何错误的退出),或者,由@Phydaux指出,一个On Error Goto 0(上错误,停止执行),否则如果那里有东西触发错误,你可能会进入错误处理程序和代码之间的无限乒乓循环。

ProcExit: 
    On Error Resume Next ' or, alternatively, On Error Goto 0 
    Connection.Close 
    Connection = Nothing 
    Close File 
    SomePreciousResource.Release 
Exit Sub 
+0

@Jean:错误处理程序标签后面的错误继续下一个是+1。让我重新思考我在做什么。但是,如果我想在执行错误后执行该行,该怎么办?在这种情况下使用“下一个继续”可以吗?希望你能得到我想说的话(英语不是我的母语)。 – Oneide 2011-05-27 12:27:40

+1

对于ProcExit:部分,“On Error GoTo 0”也可能适用。但是你肯定想要一个或另一个,否则你会面临无限循环的风险。 – 2011-05-27 13:02:31

+0

@Oneide:你的意思是,做错误处理,然后继续执行导致错误的语句之后的行?是的,在这种情况下,“Resume Next”应该是错误处理程序的最后一个语句。说实话,我从来没有真正找到一个很好的理由来做到这一点。 – 2011-05-27 13:08:04

相关问题