Eliminareerrori+应用程序执行时出现的错误往往是由一些不可预见的动作引发的。这些错误都称为运行时错误。通过使用错误处理程序用户可以避免运行时错误,给用户提供有用信息,并正确地退出应用程序。+如果程序在VisualBasic开发环境中运行时出现运行时错误,会有消息告知:进入调试模式、寻求帮助或者选择结束应用程序。如果应用程序作为可执行文件执行时出现运行时错误,VisualBasic则显示一则错误消息,应用程序也就此结束。要避免运行时错误,可以编写错误处理程序,修正出错处,提示用户正确操作,或者在程序结束前保存数据。+错误处理程序是一个例程,它捕获应用程序中出现的错误,并对错误做出反应。如果预料到一个过程可能发生运行时错误,就应该在过程中添加错误处理程序。+在错误发生时,通过告知应用程序转向哪段程序可以设定或启用某个错误捕获。VisualBasic在执行OnError语句时会启用错误捕获。包含它的过程处于活动状态时,该错误捕获始终有效。在给定过程中一次只能启用一个错误捕获。另外,错误捕获必须放在本地过程中。不能用OnError语句把应用程序的执行引向另一个过程。如果要使错误捕获无效,可使用OnErrorGoTo语句。+编写错误处理例程的第一步是添加一个行号,标志着错误处理程序的开始。行号的名称应是描述性的,后面必须跟一个冒号。常规错误处理程序放在过程结束处,紧跟着ExitSub或ExitFunction的行号之后。这样,在没有错误发生时,过程就不会执行错误处理程序。+使用Resume或ResumeNext语句就可以退出错误处理例程。Resume语句会执行引发错误的那句代码,ResumeNext语句执行引发错误代码的下一句代码。如果错误处理程序能够修正错误,则使用Resume语句,否则就使用ResumeNext语句。+借助于OnError语句,可以测试可捕获错误并对它做出响应。如果出现运行时错误,则可强制应用程序跳转到由OnErrorGoTo语句指定的标记处。+当VisualBasic执行OnError语句时激活错误捕获,OnError语句指定错误处理程序。当包含错误捕获的过程是活动的时候,错误捕获始终是激活的,也就是说,直到这个过程执行Exit或End语句时,错误捕获才停止。+尽管在任一时刻,任一过程中只能激活一个错误捕获,但可建立几个供选择的错误捕获并在不同的时刻激活不同的错误捕获。借助于OnErrorGoTo0也能停用某一个错误捕获。为设置一个跳转到错误处理例程的错误捕获,可用OnErrorGoTo行标签语句。+编写错误处理例程的第一步是添加行号,标志着错误处理例程开始。行号应该有一个具有描述性的名称,其后必须加冒号。+把错误处理代码放置在过程末端,这个过程在紧靠行号前方处具有Exit语句。如果没有出现错误,过程可避免执行错误处理代码。+错误处理例程包含实际处理错误的代码,通常以Case或If…Then…Else判定结构的形式出现。需要确定可能会发生什么错误并对每种错误提供操作方法。+为了处理所有意想不到的错误,应使用Else或CaseElse语句提供选项。+Err对象的Number属性包含数值代码,代码代表最新的运行时错误。借助Err对象与SelectCase或If…Then…Else语句的组合,可对出现的任何错误采取针对性的操作。+设定错误捕获后,如果不是过程执行结束,或错误捕获失效,否则错误捕获始终是有效的。使用Resume语句可以指定应用程序在处理完错误后恢复正常执行的位置。+语句OnErrorResumeNext可以使应用程序在执行时忽略错误。如果出现运行时错误,程序继续执行下一行。这种形式的OnError语句用于内联错误。+ResumeNext也可用于发生在循环内的错误,此时,需要重启动操作。还可使用Resume行号,它把控件返回到指定的行号。+Err对象包含刚被引发的错误的信息,使用Err对象的属性和方法可以检查发生了什么错误,清除错误值、或引发一个错误。+Number属性是一个整数,指示最新发生的错误。+Description属性是一个字符串,含有对错误的描述。+Source属性包含产生错误的应用程序的名称。在使用Automation时,这个属性会很有用。如果用户在访问Excel2007时,Excel2007产生了错误,Excel2007会把Err.Number设置成正确的错误代码,把Err.Source设成Excel.Application。+Clear方法清除错误,它把Err.Number的值复置为零。这种方法主要用于处理内联错误。+有时,用户可能不想设置错误处理程序,让应用程序在错误发生时跳转到这个程序,而是想在内联里处理某个错误。+在程序中添加OnErrorResumeNext语句,在每个可能含有错误的语句后检测Err.Number的值。用Err.Clear重置错误编号。处理内联错误的程序代码中不包含标号或Resume语句。+使用OnErrorResumeNext时要特别小心,用户的错误处理程序可能会忽略用户没有意识到的错误。+Raise方法引发一个错误。如果想避免复制错误捕获程序,可以用Raise方法把错误传回调用过程,或检测错误处理程序。VisualBasic有足够的号码对应自己的错误,且有富余。如果用户想生成并捕获自己的错误,可以使用32767以下的数字。+一个事件过程调用过程A,过程A调用过程B,过程B调用过程C,当执行过程C时,其它过程挂起。+如果过程C中出现错误,而且这个过程没有激活的错误处理程序,则VisualBasic在调用列表中沿挂起的过程向后搜索,首先搜索过程B,过程A,然后是初始事件过程,并执行查找到的第一个激活的错误处理程序。如果在调用列表中的所有地方都没有遇到激活的错误处理程序,则显示默认的意外错误信息并终止执行。+如果VisualBasic查找到一个激活的错误处理例程,执行会在这个例程中继续下去。如果在错误处理例程中执行Resume或ResumeNext语句,执行也继续下去。+如果错误处理程序的错误范围不包括实际产生的错误,则在具有激活的错误处理程序的过程内会产生意想不到的错误。这时过程可能会陷入死循环,特别是如果错误处理程序还执行Resume语句时,情况更是如此。为防止这种情况出现,在程序内的CaseElse语句中使用Err对象的Raise方法。这实际上是在错误处理程序内生成一条错误,从而迫使VisualBasic通过调用列表搜索能够处理错误的处理程序。+通过调用列表后退搜索的效果很难预测,因为这要取决于在成功处理错误的处理程序中是否执行了Resume或ResumeNext语句。Resume把控件返回到刚执行过的过程调用,而该过程包含错误处理程序。ResumeNext则把控件返回到最近一次执行过的过程调用之后的任何语句之处,而且调用的过程包含错误处理程序。+当用几个模块编写大型VisualBasic应用程序时,错误处理代码可能相当复杂。+调试代码时,对于在程序中没有代码处理具体错误的情况,应该在所有错误处理程序中使用Err对象的Raise方法重新生成错误。由此,应用程序就可按照调用列表,试着把其它错误处理例程中的错误加以改正。如果发生一个代码未处理的错误,则也要确保VisualBasic显示错误信息。在测试代码时,这一技术有助于发现难以处理的错误。但是,对于独立方式的可执行文件,应该切记:如果执行Raise方法,而且无任何其它过程捕获错误,则应用程序将立即中断执行,且没有任何QueryUnload或Unload事件发生。+在处理错误后,如果需要明确地清除Err对象,则可以用Clear方法。当使用具有OnErrorResumeNext的联机错误处理时,这种做法是非常必要的。VisualBasic无论何时执行任何类型的Resume语句、Exit语句或者其它OnError语句,都可自动调用Clear方法。+如果不希望另一个过程在调用列表中的捕获错误,则可用Stop语句强制终止代码。在开发环境中优化代码时,可以用Stop检查错误的上下文。+编写一个故障保险的错误处理过程,所有错误处理程序都可调用它作为最后手段,解决不能处理的错误。故障保险的过程能够按卸载窗体和保存数据的顺序中断应用程序。+只要有可能,就应该把自己的代码编制成标准函数,使它包含完整的错误处理程序。然后在程序中调用这个函数。函数应返回一个值,表明是否成功处理了发生的错误。+通过创建错误处理主函数,可以把应用程序中那些主要的错误处理集中起来,并由这个主函数指示过程如何处理错误。然而,由于Resume语句只能使用在含有OnError语句的过程中,所以如果要求过程能处理错误,则过程中必须含有错误处理程序。+在应用程序中添加错误处理代码时,很快就会发现有可能反复处理的是相同的错误,那么编写几个可供错误处理代码调用来处理公共错误情况的过程,就可减少代码的数量。+VisualBasic开发环境下有三种通用错误捕获选项:发生错误时中断、在类模块内中断和遇到未处理的错误时中断。+在【工具】菜单中单击【选项】,在【选项】对话框中单击【通用】选项卡,在【错误捕获】单选框中选择要求的单选项,单击【确定】。+如果在过程中激活了错误捕获,则当过程执行完毕后,错误捕获会自动失效。但是,当过程里的代码一直在执行时,可能也会想要关闭过程中的错误捕获。要关闭激活的错误捕获,可用OnErrorGoTo0语句。一旦VisualBasic执行了这个语句,则在过程内检测错误而不捕获错误。在过程中到处都可用OnErrorGoTo0来关闭错误处理,甚至在错误处理例程自身内。