AddVectoredExceptionHandler 是 SetUnhandledExceptionFilter 的替代品吗?
Is AddVectoredExceptionHandler a replacement for SetUnhandledExceptionFilter?
Some resources seem to suggest that instead of using SetUnhandledExceptionFilter
to catch unhandled exceptions, one could use AddVectoredExceptionHandler
收到所有异常通知。
然而,据我所知,vectored handler 是 "just" 调用程序中引发的 each 和 every (SEH) 异常, 先于确定是否或在何处处理异常。
我错过了什么吗?
好评:
It is not [a replacement], the callback doesn't promise anything about the exception getting handled. That happens later. It is, at best, useful as a diagnostic tool to troubleshoot problems with a program that contains too many try/catch-em-all statements. Compare to the .NET AppDomain.FirstChanceException event, the kind of feature that requires AVEH.
– 汉斯·帕桑特
话虽如此 - 在重新阅读文档后我同意 - 我认为 "confusion",如果你愿意,在我链接到的 original question 中,可能源于原始问题说
it should catch & properly handle all access violation exceptions which occur in the process
你当然可以使用向量异常处理程序,也就是说,你可以拦截所有0xC0000005
通过一个 VEH,但您不知道围绕它的代码是否真的可以捕获并处理它——并且,在低级别或特定情况下,捕获访问冲突并在捕获站点继续是一种有效的方法。
因此,正如 Hans 所说,它充其量只是一种有用的诊断工具。
或者,换句话说,向量异常处理程序 不会捕获异常 ,如果您将 "catching" 解释为 catch
和__except
在更高级别捕获引发的异常。
VectoredHandler
仅支持 EXCEPTION_CONTINUE_SEARCH
:查找处理程序和 EXCEPTION_CONTINUE_EXECUTION
:我从未完全掌握的用法。
Some resources seem to suggest that instead of using SetUnhandledExceptionFilter
to catch unhandled exceptions, one could use AddVectoredExceptionHandler
收到所有异常通知。
然而,据我所知,vectored handler 是 "just" 调用程序中引发的 each 和 every (SEH) 异常, 先于确定是否或在何处处理异常。
我错过了什么吗?
好评:
It is not [a replacement], the callback doesn't promise anything about the exception getting handled. That happens later. It is, at best, useful as a diagnostic tool to troubleshoot problems with a program that contains too many try/catch-em-all statements. Compare to the .NET AppDomain.FirstChanceException event, the kind of feature that requires AVEH.
– 汉斯·帕桑特
话虽如此 - 在重新阅读文档后我同意 - 我认为 "confusion",如果你愿意,在我链接到的 original question 中,可能源于原始问题说
it should catch & properly handle all access violation exceptions which occur in the process
你当然可以使用向量异常处理程序,也就是说,你可以拦截所有0xC0000005
通过一个 VEH,但您不知道围绕它的代码是否真的可以捕获并处理它——并且,在低级别或特定情况下,捕获访问冲突并在捕获站点继续是一种有效的方法。
因此,正如 Hans 所说,它充其量只是一种有用的诊断工具。
或者,换句话说,向量异常处理程序 不会捕获异常 ,如果您将 "catching" 解释为 catch
和__except
在更高级别捕获引发的异常。
VectoredHandler
仅支持 EXCEPTION_CONTINUE_SEARCH
:查找处理程序和 EXCEPTION_CONTINUE_EXECUTION
:我从未完全掌握的用法。