Private Sub Form_Load()
cc = SetUnhandledExceptionFilter(AddressOf UnhandledExceptionFilter)
Dim err As Long
err = GetLastError
Debug.Print err
Dim a As Long
a = 2 ^ 32 '这个地方是溢出 为什么捕获不到
End Sub
Public Function UnhandledExceptionFilter(ByVal lpExceptionInfo As Long) As Long
Debug.Print "进入"
UnhandledExceptionFilter = EXCEPTION_EXECUTE_HANDLER
End Function
cc = SetUnhandledExceptionFilter(AddressOf UnhandledExceptionFilter)
Dim err As Long
err = GetLastError
Debug.Print err
Dim a As Long
a = 2 ^ 32 '这个地方是溢出 为什么捕获不到
End Sub
Public Function UnhandledExceptionFilter(ByVal lpExceptionInfo As Long) As Long
Debug.Print "进入"
UnhandledExceptionFilter = EXCEPTION_EXECUTE_HANDLER
End Function
应该在前面加 On error goto ErrLine
代码结尾处放置Errline:处理错误信息
就是说
Private Sub Form_Load()
cc = SetUnhandledExceptionFilter(AddressOf UnhandledExceptionFilter)
Dim a As Long
a = 2 ^ 32 '这个地方是溢出 为什么捕获不到
End Sub这个样子还是没办法触发异常。。 我试了下内存错误 也是触发不到。 这个应该怎么做啊?
vb编译程序的每个过程都有:.text:00401BE6 push (offset loc_401095+1)
.text:00401BEB mov eax, large fs:0
.text:00401BF1 push eax
.text:00401BF2 mov large fs:0, esp
.text:00401BF9 sub esp, 18h人家都设置好SEH了,如果你要用自己的SEH,需要处理前面VB编译器已经设置的SEH类似文章:
http://www.pediy.com/kssd/pediy07/pediy7-759.htm
修改这里jmp ds:__vbaExceptHandler为自己的错误处理程序地址,可以跳到自己的处理程序.
如果程序中没有on error goto...这样的错误处理,vb编辑器用的都是__vbaExceptHandler来处理.所有LZ实际每一必要用API来实现自己的错误处理,用on error就能够替代API了.如果要做其他用途,好像一很难把自己的代码添加进去,没有on error的任何vb过程,一进入过程编译器就添加了错误处理为__vbaExceptHandler,在过程结束的地方编译器添加了取消错误处理的代码.这样在一个过程中不能调用新的过程(会又添加一次错误处理__vbaExceptHandler),而且自己也不能像汇编那样自己方位FS:[0]那些数据...
API并不能捕获所有异常,msdn有说明
on error resume next
cc = SetUnhandledExceptionFilter(AddressOf UnhandledExceptionFilter)Dim a As Long
a = 2 ^ 32 '这个地方是溢出 为什么捕获不到Dim err As Long
err = GetLastError
Debug.Print err
End Sub