在自定义函数中,如果出现错误怎么处理呢,比如某函数负责从数据库中获取人员信息,通过id来查询人员信息,但如果没有找到该id信息,怎么反馈呢。
还有,如果在函数中做判断,能否让程序在这个位置停止运行,希望运行exit sub,但系统不允许,不知道有没有其他解决方案。谢谢各位啊!

解决方案 »

  1.   

    msdn如下内容on error goto 0 '取消错误
    on error resume next '忽略
    error '丢出错误
    stop '调试的时候停止可以配合如上语句处理完错误返回sub程序。增加一个byref类型的参数表示状态。
      

  2.   

    建议楼主赶紧到这上面,把“(800 KB). IDE: Visual Basic 6.0”那个插件装上
    http://www.mztools.com/v3/download.aspx
    他会在VB IDE中增加工具栏,其中有一个按钮就是加错误处理的,比如
    Sub t1()End Sub
    你点一下,就变为
    Sub t1()   On Error GoTo t1_Error       On Error GoTo 0
       Exit Subt1_Error:    MsgBox "错误 " & Err.Number & " (" & Err.Description & ") in procedure t1 of Form Form1"
    End Sub
      

  3.   

    大致如下
    public sub subAA()
    On Error Goto errSub
       
       Exit Sub
    errSub:
    end Sub
      

  4.   

                    On Error GoTo errline
                        cn_desc.Execute strtmp
                    On Error GoTo 0
    errline:                     '这里处理错误
        Text1 = Text1 & str & " 错误原因: " & Err.Description & Chr(13) & Chr(10)  '给出错误信息
        Text1 = Text1 & "---------------------------------------------------" & Chr(13) & Chr(10)
        Resume Next '继续执行后面的程序
      

  5.   

    不好意思,大概是我没有说清楚,我不是想处理异常的错误,从我自己的编程习惯出发,我也很少使用On Error GoTo的语句,现在是我写了一个函数,专门来获取人员信息。比如Public Function get_student(Stdid As String) As student
        Dim rs As New ADODB.Recordset
        rs.Open "select * from students,std_class where stdid='" & Stdid & "' and std_class.classno=students.classno", cn, adOpenStatic, adLockReadOnly
        If Not rs.EOF Then
            get_student.stdname = Trim(rs.Fields("stdname"))
            get_student.xb = Trim(rs.Fields("xb"))
        End If
        rs.Close
    End Function那么在程序中调用这个函数的时候,如果出现rs.eof=true,就是相应的stdid不存在对应数据的时候怎么处理,比如在程序中stdinfo = get_student(Stdid),如果找不到数据能否直接出现提示信息,没有找到该用户信息,并且退出调用的程序段,因为后面需要调用用户的详细信息了。
    不知道这样是否表述清楚了,谢谢各位了。
    从其他意义上来讲,如果非要用On Error GoTo语句,似乎也能解决问题,但感觉上不是很严谨,还有没有更严格的处理方法。
      

  6.   

    On Error GoTo和是否严谨没有关系。推荐你看一本书《Visual Basic 防御性编程》,老美写的,要去图书馆看了。
    你在网上看的代码,是自身写得很不规范,和用了On Error GoTo无关。你说的要显示错误信息,可以依赖Err.Description和Err.Number来取得。
      

  7.   

    错误处理少不了on error.....,我觉得严格的说,你的问题实际上不只是错误处理问题,还有方法问题,比如如下就是一种方法:Public Function get_student(Stdid As String,myStudent As student,optional msg as string) as long
    on error goto err_
        Dim rs As New ADODB.Recordset
        rs.Open "select * from students,std_class where stdid='" & Stdid & "' and std_class.classno=students.classno", cn, adOpenStatic, adLockReadOnly
        If Not rs.EOF Then
            myStudent.stdname = Trim(rs.Fields("stdname"))
            myStudent.xb = Trim(rs.Fields("xb"))
            get_student=1
        else
            get_student=0
        End If
        rs.Close
        exit function
    err_:
        get_student=-1
        msg=err.description
    End Function
    如上你就可以根据get_student的值来处理具体问题了....
      

  8.   

    建议:同一问题不要问二遍,浪费CSDN财产!还不如合在一起100分,更有吸引力!
    8楼这个不错,支持!
      

  9.   

    感谢各位的回复,对vbman2003的回答比较中意,结贴了。
    再次感谢。
      

  10.   


    Public Function get_student(Stdid As String,myStudent As student,optional msg as string) as long
    on error goto err_
        Dim rs As New ADODB.Recordset
        rs.Open "select * from students,std_class where stdid='" & Stdid & "' and std_class.classno=students.classno", cn, adOpenStatic, adLockReadOnly
        If Not rs.EOF Then
            myStudent.stdname = Trim(rs.Fields("stdname"))
            myStudent.xb = Trim(rs.Fields("xb"))
            get_student=1
        else
            get_student=0
        End If
        rs.Close
        exit function
    err_:
        get_student=-1
        msg=err.description
    End Function
    这个还不如写成类,直接返回属性和集合。
      

  11.   

      On Error GoTo BadData
      Trains(lngTrainNo).LateMinute = txtLateEdit(3).Text
      On Error GoTo 0
      'Trains(lngTrainNo).PathNo = cbUsePath.ItemData(cbUsePath.ListIndex)
      
      Trains(lngTrainNo).PathNo = cbUsePath.ListIndex
       
      For i = lngLedTrains To 1 Step -1
        If LedTrains(i).InnerTrain = txtLateEdit(0).Text Then
          RemoveMemoryLedTrain i
        End If
      Next
      For i = 1 To lstTrainPosition.ListCount
        If lstTrainPosition.Selected(i - 1) Then
          AddMemoryLedTrain i, txtLateEdit(0).Text
        End If
      Next
      lngLastMinute = -1
      StaBar.Panels(1).Text = "已保存。"
      i = lstTrains.ListIndex
      LoadTrainsList
      lstTrains.ListIndex = i
      SaveLate = True
      Exit Function
    BadData:
      MsgBox "请录入正确的晚点时间,以分为单位,-1是晚点未定", vbOKOnly + vbInformation, "晚点修改、候车室及股道变更"
      txtLateEdit(i).SetFocus
      StaBar.Panels(1).Text = "未保存。"
      SaveLate = False