虽然vb有错误处理语句,但是程序中往往会发生一些难以预料的错误。
比如程序a发生了错误,弹出了一个错误对话框,这时如果人工关闭这个对话框的话程序a肯定会退出。那么如何不用人工干预,用程序b如何能检测到a已发生错误呢?又如何这个出错的程序a关闭并重新运行呢?

解决方案 »

  1.   

    我在CSDN上有看到这么一句话,错误处理语句可能会是正常的代码两倍以上。这句话,我认可,错误处理系统比正常系统更难设计个人一点意见,仅供参考
      

  2.   

    首先VB的错误处理不允许那么底层的错误拦截,如果出现了错误处理拦截不到的一定会崩溃。看你要求是要做守护程序啊。检测目标程序是否在运行的方法挺多的。FAQ里就有
      

  3.   

    只要知道程序a的完整路径,用Timer控件定时对它作写访问测试就可以了。对正在执行的exe文件作写访问一定会失败的。如果发现能够执行写访问,说明程序退出了。不过这种方法不够实时,有一定的迟滞。
      

  4.   

    public sub Main()
      on error goto ErrExitErrExit:
        shell "自己"
        End
    end sub
      

  5.   

    public sub Main()
      on error goto ErrExit
      ...
      Exit sub
    ErrExit:
        shell "自己"
        End
    end sub
      

  6.   

    我以前用过一个截获系统异常的方法,不知道合不合用.你可以试一下.'替换系统的默认错误处理程序的函数。
    Private Declare Function SetUnhandledExceptionFilter _
    Lib "kernel32" (ByVal lpTopLevelExceptionFilter As Long) _
    As LongPrivate Type EXCEPTION_POINTERS
        pExceptionRecord As Long
        ContextRecord As Long
    End Type
    '新的异常处理函数
    Public Function NewExceptionHandler( _
        ByRef lpExceptionPointers As EXCEPTION_POINTERS) As Long
        
        
    End Function---------------------------------------------------------------
    函数的用法可以参考我的blog上的一篇文章:
    http://blog.csdn.net/qiqi5521
    取硬盘物理序列号的完整代码
      

  7.   

    qiqi5521() 朋友的方法具体怎么用啊?
      

  8.   

    SetUnhandledExceptionFilter的功能是替换系统默认的全局异常处理函数。这个“全局”指的是Windows系统。Windows系统中所有得不到处理的异常都要经过全局异常处理函数来处理。用这个函数可以把系统默认的全局异常处理函数替换成一个普通的VB函数,替换之后,系统中发生的所有得不到处理的异常都要由这个VB中的函数来处理。更详细的信息请参考msdn.参数 ByVal lpTopLevelExceptionFilter As Long 就是你要替换的函数的地址。如果把该参数设置为0,则表示还原系统默认的全局异常处理函数。
    你可以试一下,在一个标准模块中定义一个替代全局异常处理函数的普通VB函数,定义如下:'新的异常处理函数
    Public Function NewExceptionHandler( _
        ByRef lpExceptionPointers As EXCEPTION_POINTERS) As Long
        
        msgbox "截获了系统异常"
    End Function
    然后在form_load事件中,写如下代码:SetUnhandledExceptionFilter addressof NewExceptionHandlerform_unload中写如下代码:
    SetUnhandledExceptionFilter 0&接下来运行程序,就可以截获系统异常了。
      

  9.   

    刚才试了一下,只能截获本进程内的异常,其他进程的异常截获不了。可能是还有别的专门截获全系统函数?
    我把全部代码发上来,你可以参考一下。module1.bas----------------------------------------------------------------
    Option Explicit'替换系统的默认错误处理程序的函数。
    Public Declare Function SetUnhandledExceptionFilter _
    Lib "kernel32" (ByVal lpTopLevelExceptionFilter As Long) _
    As Long
    Private Type EXCEPTION_POINTERS
        pExceptionRecord As Long
        ContextRecord As Long
    End Type'新的异常处理函数
    Public Function NewExceptionHandler( _
        ByRef lpExceptionPointers As EXCEPTION_POINTERS) As Long
        
        MsgBox "截获了系统异常!"
    End Function--------------------------------------------------------------------------
    form1.frm-----------------------------------------------------------------
    Option Explicit
    Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)Private Sub Command1_Click()
    CopyMemory ByVal 0&, 8&, 4
    End SubPrivate Sub Form_Load()
    SetUnhandledExceptionFilter AddressOf NewExceptionHandlerEnd SubPrivate Sub Form_Unload(Cancel As Integer)
    SetUnhandledExceptionFilter 0&
    End Sub--------------------------------------------------------------------------
      

  10.   

    我想可不可以这样:假设 A 程序是你要运行的程序,一直运行,当 A 程序运行正常的状态下,那么我可以用DDE的方式向 B 程序每隔一段时间发送一个command指令(string),B 程序负责接受这些指令,如果发现在某一段时间内没有接收到的话,那么就判定 A 程序已经挂掉了,你就可以对其进行处理啊。