zoukankan      html  css  js  c++  java
  • On Error Resume Next 与 On Error Goto 0

    以前的一个问题:On Error Resume Next之后怎么样才能再显示出错信息

    <%
    On Error Resume Next
    在On Error Resume Next的所有Err都不会抛出
    On Error Goto 0
    在On Error Goto 0的所有Err都会抛出
    %>

    在VBScript中,与错误处理相关的三者:On Errow Resume Next, On Error Goto 0, Err

    1、最基本的错误提示
    Dim i
    i = 1/0
    结果:

    Microsoft VBScript 运行时错误 错误 '800a000b' 被零除

    /test.asp,行 3

    2、防止系统的错误提示

    使用On Errow Resume Next,可以放置系统提示错误,并且好像什么都没有发生一样,沉默的运行下去
    On Errow Resume Next
    Dim i
    i = 1/0

    运行结果:



    3、检查系统的错误

    使用了On Errow Resume Next之后,如果出错Err对象中将放置最近一次出错的信息。Err对象重要的属性有三个:Number, Source, Description。分别是错误号,错误来源,错误描述。你能捕获的都是运行时错误,而且If Err then这样的写法等价于If Err.Number then
    On Errow Resume Next
    Dim i
    i = 1/0
    Execute "test"
    Response.Write Err.Description

    运行结果:

    类型不匹配

    可以看到,提示的并不是被零除

    4、让系统重新接管错误的处理

    On Error Goto 0 ,使用这条语句会让系统不再沉默,一旦有错误发生就会提示错误,并结束脚本执行。
    On Errow Resume Next
    Dim i
    i = 1/0
    Response.Write "1"
    On Error Goto 0
    i = 1/0
    Response.Write "2"

    运行结果:

    1

    Microsoft VBScript 运行时错误 错误 '800a000b'
    被零除

    /test.asp,行 7

    可以看到,第一个1输出了,第二个没有。

    5、On Errow Resume Next对子程序的影响

    先看例子
    Sub test()
     Dim i
     i = 1/0
     Response.Write "OK"
    End Sub
    Sub test1()
     test
     Response.Write "OK"
    End Sub
    On Errow Resume Next
    test1

    运行结果是:



    两个ok都没有被打印。因为On Errow Resume Next是在最完成下达的,所以当调用的子程序中出了问题之后,那些子程序后面的部分无权处理,是由最完成的代码来完成,会直接从子程序中跳出。

    6、On Errow Resume Next对子程序的影响(2)

    还是看例子
    Sub test()
     On Errow Resume Next
     Dim i
     i = 1/0
     Response.Write " 3 "
    End Sub
    Sub test1()
     test
     Response.Write " 2 "
    End Sub
    On Errow Resume Next
    test1
    Response.Write " 1 "

    执行的结果是:

    3 2 1

    可见在test()中用了On Errow Resume Next之后,这个子程序中这条语句之后的错误都将自己来处理,但是Err对象在退出了这个函数时并不会被清空,在test1和底层中仍然能够通过Err对象来知道test()的错误的发生。

    7、对On Errow Resume Next行为的解释

    a、执行了On Errow Resume Next之后,在这之后的所有代码产生的“未宽恕”的错误都不会中断代码的执行

    b、如果没有执行On Errow Resume Next,所有“未宽恕”的错误都会导致程序的控制流程往上层流转,如果当前是最底层了则由系统打印错误。

    c、“未宽恕”的错误导致流程往上层流转,如果上层的子程序是在On Errow Resume Next之后调用了这个产生错误的子函数的,则这个“未宽恕”的错误变成了“宽恕”的错误,不再影响程序的流程。

    d、On Errow Resume Next的作用其实是局限于一个子程序中的,它只能保证使用了这个语句之后,在这个子程序内的程序流程不会受到运行时错误的影响。而它并不会影响上层和下层的错误处理逻辑。

    8、On Error Goto 0的行为与On Errow Resume Next一致,其影响都是局限在子程序内部的。
    Sub test()
     On Error Goto 0
    End Sub
    On Errow Resume Next
    test
    Dim i
    i = 1/0

    运行结果:



    可见test()中的On Error Goto 0并不能把它的影响带到上层去。

    9、Err对象的赋值

    Err对象会在运行时错误发生的时候赋予新的值,旧的值会被舍弃。

    Err对象不会受到函数调用的影响,它完全是全局的。

    Err对象可以用Clear方法清空

    任何时候调用On Errow Resume Next或者on error goto 0的时候,都会清空Err对象

    10、小结

    可见这个错误处理系统只能勉强用来获得运行时错误的信息,个人感觉很不方便,所以很难把程序的错误处理基于这样一个的怪异系统之上。
  • 相关阅读:
    GetBuffer与ReleaseBuffer的用法,CString剖析
    Mysql 关闭自动提交
    Mysql 创建用户和数据库
    老爸陪我去面试——北漂18年(3)
    Java中的“&”和“&&”的区别
    Java常量定义
    利用Java API生成50到100之间的随机数
    Java考查“==”和equals
    列出JDK中常用的Java包
    cognos 配置
  • 原文地址:https://www.cnblogs.com/luowei/p/1402227.html
Copyright © 2011-2022 走看看