在代码中通常可以使用On error来捕获错误并处理,而如果捕获错误语句不能将错误捕获而直接触发源错误提示则会使VB可执行程序整个强行关闭,这不是我们所期望的,所以请问各位有没有这方面处理的技巧?谢谢!

解决方案 »

  1.   

    碰到这样问题,程序也就差不多要崩溃了,还是改进去吧。要不用外部debug程序也可以,具体的嘛,我不太了解:)
      

  2.   

    现在不是加不加on error捕获错误的问题,也不是程序要崩溃的问题,而是在期望VB能捕获错误的语句上,始终不能返回给VB控制权以进行错误处理,如下on error goto errhld
    if rs.fields(0).underlyvalue<>1 then '执行到此语句会出现错误,并且我也知道会出现错误,但上面的那句on error却不起作用,无法进入到erhld过程总,应该怎么办?
    ......
      

  3.   

    if rs.fields(0).underlyvalue<>1 then 在调试时就通不过,VB不是已经捕获到错误,告诉你信息了吗?
      

  4.   

    我也碰到过 数据访问时 的类似问题,我的解决办法如下:Set Error=Nothing
    on error goto errhld
    if rs.fields(0).underlyvalue<>1 then .................................
      

  5.   

    to sxs69():麻烦的就是在这里了,明明VB在debug下是可以捕获该错误,但我就是无法进行控制。
      

  6.   

    无法进行控制?
    为什么呢?
    捕捉到了,程序不就跳转到errhld了吗?在errhld写相关处理
      

  7.   

    VB在debug下是捕获的错误,需要你进行控制吗?把代码改对不就可以了,你不是要做一个vb的调试程序吧?
      

  8.   

    to rainstormmaster(rainstormmaster):你可能误解我的意思了,实际情况就是如ydzqw(===七条狗===)(@@我不爱做菜)所说的,如果程序跳转到errhld,那么我就能在errhld中进行处理了。但现在就是不跳到errhld中,所以想问还有什么办法能让其进行错误处理?
      

  9.   

    无法用On Error抓取的那些错误,可能得自己分析到底是什么错误吧。
    如“if rs.fields(0).underlyvalue<>1 then '执行到此语句会出现错误,并且我也知道会出现错误,但上面的那句on error却不起作用,无法进入到erhld过程总,应该怎么办?”这个.underlyvalue的用法是有问题。如果改成
    if rs.fields(0) <>1 then ---就没有问题。如果这样还有问题,得查一查rs集现在是在什么位置,是不是空记录。
      

  10.   

    VB中有一类的错误是无法截取到的,就是在事件里面触发的错误,比方说Form_Load中触发的错误外面就截不到因为这种事件是VB自己调用的,当在Form_Load中发生错误时,VB就认为是严重的错误,VB默认结束你看看那个错误是不是这类原因,你也没有代码,只好帮你猜了 :)
      

  11.   

    ADO有许多错误是不能用ON Error抓取的,但多半是记录集为空、跳到空记录、值为null造成的。还有,它的一些错误要在willmove和movecomplete及其它一些相关属性或事件中去抓取。
      

  12.   

    恩,各位说得对,我知道ADO中是会有些错误无法捕捉,但如果不能捕捉则意味着我无法处理。这个错误的源其实是ADO在更新时更新已删除记录,那么underlyvalue势必就会是非法了,但我需要捕捉这个错误从而能对错误进行控制,而不是直接退出程序。
      

  13.   

    支持ydzqw(===七条狗===)(@@我不爱做
      

  14.   

    那你就用delphi把!或java,呵呵。
      

  15.   

    没有无法捕捉的错误。只要用On error goto ...
    在我的程序的每个过程、函数里几乎都会有这一句,除非我肯定那里不会有错误,
    VB不像Delphi一样,一出错就会全盘退出!
      

  16.   

    to gxhwq(Buger):是么,但我知道那里一定是有错误的。并且我也希望对错误进行提示或者就resume next 但这个错误情况却一直会发生,并且VB就全盘退出了。
      

  17.   

    我觉得:
    不应该使用VB的错误处理,应该使用ADO的错误处理,ERROR对象
    试试看又:编程序的时候尽量先查条件,不能什么都靠错误处理的,错误处理是异常情况,你不能控制的情况下才用的
      

  18.   

    to hf4057(神仙) :嗯,谢谢,但我要处理的是更新已被删除的记录,这样的问题你能先知道么?我只能是靠捕捉错误来进行处理
      

  19.   

    对于ado里面的错误,应该用Ado里面的Error对象来处理!
    'BeginDescriptionVB
    Public Sub DescriptionX()   Dim Cnxn As ADODB.Connection
       Dim Err As ADODB.Error
       Dim strError As String   On Error GoTo ErrorHandler
       
       ' Intentionally trigger an error
       Set Cnxn = New ADODB.Connection
       Cnxn.Open "nothing"
       
       Exit SubErrorHandler:   ' Enumerate Errors collection and display
       ' properties of each Error object
       For Each Err In Cnxn.Errors
          
          strError = "Error #" & Err.Number & vbCr & _
             "   " & Err.Description & vbCr & _
             "   (Source: " & Err.Source & ")" & vbCr & _
             "   (SQL State: " & Err.SQLState & ")" & vbCr & _
             "   (NativeError: " & Err.NativeError & ")" & vbCr
          If Err.HelpFile = "" Then
             strError = strError & "   No Help file available"
          Else
             strError = strError & _
                "   (HelpFile: " & Err.HelpFile & ")" & vbCr & _
                "   (HelpContext: " & Err.HelpContext & ")" & _
                vbCr & vbCr
          End If
             
       Debug.Print strError
       Next   Resume NextEnd Sub
    'EndDescriptionVB
      

  20.   

    to  gpo2002(永吹不休) :哎,我都说了很清楚了,我连ErrorHandler都进不了,何来使用error对象处理的机会?
      

  21.   

    楼主说的情况我还没遇过,如果用不了on error的话,就试下下面的方法。希望对楼主有用。Dim conn As new ADODB.Connection
    On Error Resume Next
    conn.Open "nothing"
    if conn.Errors.Count>0 then
       'do something here
       for i=0 to conn.Errors.Count-1   
           msgbox conn.Errors.Item(0).Description
       next
       'set ado object as nothing
    end if
      

  22.   

    上面打错字了:
     msgbox conn.Errors.Item(i).Description
      

  23.   

    以下是我的错误处理代码:
    ErrHld:
            If Err.Number = -2147217864 Then
            mp_rs.Resync adAffectAllChapters, adResyncUnderlyingValues
    大致意思为,在捕捉到有更新冲突后,进行异步获取underlyingvalue以进行比较。这样在更新已被更新的记录时很有用。但目前要解决的是更新已被删除记录的问题,因为已被删除的记录无法被更新,那么将会报更新行已被删除的错误,但棘手的是,ADO在接受到错误后,起先还是认为是更新冲突错误,即进入上面代码的错误处理,但在resync方法后,才发现是更新已删除记录的错误,就会提示错误(在IDE环境中提示错误,如果是EXE则提示后全盘退出,令我好伤心),我在resync方法之前用使用on error捕捉错误,可是无济于事。我用了error对象来判断错误,其结果也是一样,因为并不能直接捕捉到更新已删除记录的错误。请问各位还有什么办法么?
      

  24.   

    if rs.fields(0).underlyvalue<>1 then 
    UnderlyingValue是什么意思,我以前没用过,下面的语句
    MsgBox rs.Fields(0).UnderlyingValue
    执行到这一句时出现错误"-2147467259,缺少更新或刷新的基本表信息“
    是不是这个属性的使用方法有问题?不能换用其它方法吗?人想实现什么功能?
      

  25.   

    把if rs.fields(0).underlyvalue<>1 then 该为
    dim i as long
    on error goto Err_exit
      i=rs.fields(0).underlyvalue
    if i<>1 then ...
    看这样可以吗?
      

  26.   

    to  hsn1982() :搞不定,很烦。
    to wang_anjun(大笨猫) :你的思路不错,但其实我用underlyingvalue来查看其实就是使用ADO的机制自动去查是否存在记录,只是返回的结果老要出错而已。如果自己去查记录,我觉得无法定位,因为我根本对用户会更新哪条记录,其键值是什么一无所知。
      

  27.   

    我遇过这样的问题:
    我的程序是vb+access,
    当修改access库的密码后,登陆软件时程序尝试和数据库链接,
    发现密码不对,就会出错,被on error捕捉到,
    然后我做了相应的处理,也就是做一个输入框,叫用户软件数据库新的密码,
    再跳转到与数据库链接的程序行中进行尝试与数据库链接,
    如果用户输入的密码是正确的,那么链接成功,程序正常运行下去,
    如果用户输入的密码有误时,程序又会出错,
    本应该再次被on error捕捉到,然后再进行上面所说的处理,
    可这次却没有被捉到,弹出错误提示框,然后点地击确定后退出程序了。
    (第一次可以被捕捉到,第二次就不行了)这个问题到现在还没有解决呢,呵呵
      

  28.   

    to redwrite(红妆素裹):难道就没有办法了吗?
      

  29.   

    我调用API或用到线程时也出现同种情况,还请各位高手帮忙!!
      

  30.   

    如果是删除那你有没有做当记录集中地记录在上一次操作中已经删除完了,可是你后面又要对他删除势必会出错,像这样地错你有控制过吗?(这种错是可以预先判断处理地,而无需on error地介入)
      

  31.   

    to horsefly()小朋友:我们大人正在讨论关于并发冲突的问题,并且希望你能提些能够解决问题的方案,非常感谢!
      

  32.   

    to ztchen(奋斗&人生) 
    解决不了呀
      

  33.   

    我对你这个问题觉得很感兴趣。楼主如果方便,可否把代码email给我看下。
    我试着改下,email:[email protected]
      

  34.   

    以前遇到过类似问题, 但不知道怎么又解决了.
    on error goto errorhandle, 这句应该能捕获到错误的
      

  35.   

    如果错误不重要的话我一般都用on error resume next