zoukankan      html  css  js  c++  java
  • VB.NET中TryCatch结构 和较传统的On Error Resume Next

    最近接的一个该修十年前VB.net的项目,产生了好多回忆啊~~

    VB.NET中支持两种异常处理机制
    一种是传统的On Error Resume Next
    另一中是最新的Try-Catch-Finally结构化异常处理

    一般只要谈到这两种机制,大家都会说结构化异常处理会好一些,他是异常处理的首选,但是结构化异常处理与传统的On Error Resume Next语句相比,其真正的优势在什么地方呢?
    下面用一段代码来说明一下:

        if mxDEBUG=1 then        '是否启用自主错误处理
            On Error Resume Next
        end if

        conn.Open ConStr

        If Err.Number = 0 Then
                On Error GoTo 0
                Set GetConnection = conn
            Else
            SqlErrStr= chr(13) & "<br>DBA错误:<br>连接字符串:【" & ConStr & "】<br>" & chr(13)
            ErrStr = ErrStr & "错误号:" & Err.number & "(H" & Hex(Err.Number) & ")<br>" & chr(13)
            ErrStr = ErrStr & "错误描述:【" & Err.description & "】<br>" & chr(13)
            if not conn.Errors.Count=0 then
                for i=0 to conn.Errors.count-1
                    ErrStr = ErrStr & chr(13) & "<br>ADO错误号:H" & Hex(conn.Errors(i).Number) & "<br>" & chr(13)
                    ErrStr = ErrStr & "ADO错误描述:【" & conn.Errors(i).Description & "】<br>" & chr(13)
                    ErrStr = ErrStr & "ADO错误对象:" & conn.Errors(i).Source & "<br>" & chr(13)
                    ErrStr = ErrStr & "ADO_SQLState:" & conn.Errors(i).SQLState & "<br>" & chr(13)
                next
            end if
            On Error GoTo 0
                EF "<br>" & SqlErrStr & ErrStr            '写入错误记录
            Serr replace(ErrStr,chr(13),"")
            End If

    这段asp[VB]代码是我在一个程序中用来打开数据库连接的时候进行的错误处理,首先我们试着改写成流行的Try-Catch-Finally结构,呵呵,模拟一下啦

    '首先定义一点东西
    sub try
        On Error Resume Next
    end sub

    sub endTry
        if Err.Number = 0 then
            Catch
        else
            OK
        end if
        finally
    end sub

    '这里开始进入正题

        Try
            conn.Open ConStr            '可能出错的行[A]
            Set GetConnection = conn
        endTry

        sub catch
            SqlErrStr= chr(13) & "<br>DBA错误:<br>连接字符串:【" & ConStr & "】<br>" & chr(13)
            ErrStr = ErrStr & "错误号:" & Err.number & "(H" & Hex(Err.Number) & ")<br>" & chr(13)
            ErrStr = ErrStr & "错误描述:【" & Err.description & "】<br>" & chr(13)
            if not conn.Errors.Count=0 then
                for i=0 to conn.Errors.count-1
                    ErrStr = ErrStr & chr(13) & "<br>ADO错误号:H" & Hex(conn.Errors(i).Number) & "<br>" & chr(13)
                    ErrStr = ErrStr & "ADO错误描述:【" & conn.Errors(i).Description & "】<br>" & chr(13)
                    ErrStr = ErrStr & "ADO错误对象:" & conn.Errors(i).Source & "<br>" & chr(13)
                    ErrStr = ErrStr & "ADO_SQLState:" & conn.Errors(i).SQLState & "<br>" & chr(13)
                next
            end if
            On Error GoTo 0
                EF "<br>" & SqlErrStr & ErrStr            '写入错误记录
            Serr replace(ErrStr,chr(13),"")
        end sub

        sub OK
            '这里是如果不出错应该继续执行的东西
                'Set GetConnection = conn 这一句可以放在这里   
            On Error GoTo 0
        end sub

        sub finally
            '这里是不论是否出错都可以执行的地方
        end sub

    上面模拟的异常处理结构在[A]那里如果出现错误,会继续执行下去,直到执行endTry,而新的Try-Catch结构则在发生异常的时候,直接跳出去找相应的Catch语句去了
    在其他方面,两者的区别仅仅在实现的难易上,这个模拟想达到Try-Catch结构的效果是需要多写一点代码的.但是就是这个异常发生之后的一个小细节的不同,使得两种结构在处理大批量事务的时候表现出了截然不同的特性

    假如我们的模拟语句是这样的
       
        Try
            操作1
            操作2
            操作3
            操作4
            操作5
        endTry

        那我们该如何捕获错误呢?
        很显然,我们的模拟结构由于在发生错误之后仍然继续执行,可能会导致错误处理的延期,使得一些关键的错误被忽略
        而如果使用Try-Catch结构的话,他会在错误发生之后,及时的寻找相应的异常处理代码
        从而避免了错误的蔓延

        那我们想到,传统的异常处理方法如果想达到这种目的,就需要在每个操作后面放置错误检测代码,类似于这样的
        Try
            操作1:T(1)
            操作2:T(2)
            操作3:T(3)
            操作4:T(4)
            操作5:T(5)
        endTry

    function T(x)
        select case x
            case 1
                catch(1)
            case 2
                catch(2)
            case 3
                catch(3)
            case 4
                catch(4)
            case 5
                catch(5)
    end function

        呵呵,到了这里,Try-Catch的真正优势才能体现出来
        也就是说
        Try-Catch结构的优势体现在一系列相关操作所组成的一个事务的执行过程中的异常处理
        在这样的情况下,如果还用传统方式来实现的话,无疑是很麻烦的
        而在其他方面
        比如说
        1.Try-Catch实现了异常处理代码和正常业务流程的分离
            传统的On Error Resume Next也是可以实现的
            并且不会比Try-Catch结构麻烦
            所谓的分离,不过是错误统一处理罢了
            任何经过精心设计的程序结构都可以实现这种方式的
            这可不是Try-Catch的专利

    说了这么多,无非就是说
    并不是一个新方法出来了,老方法就一无是处
    并不是一个新方法出来了,就意味着老方法必须退伍了

  • 相关阅读:
    H5+CSS3知识点
    三维立体
    HTML5的Audio标签打造WEB音频播放器
    video.js-H5视频播放库
    js事件(Event)知识整理
    高端大气上档次的fullPage.js
    javascript的正则表达式学习
    轮播图—运动框架来实现(拥有透明度效果)
    Android FM模块学习之四源码分析(3)
    Android FM模块学习之四源码学习(2)
  • 原文地址:https://www.cnblogs.com/xiaoL/p/1858056.html
Copyright © 2011-2022 走看看