gpt4 book ai didi

c# - 在 FrameWork 级别捕获 WPF 中的异常

转载 作者:行者123 更新时间:2023-11-30 14:18:22 25 4
gpt4 key购买 nike

我正在开发一个轻量级 WPF MVVM 框架,并希望能够捕获未处理的异常,并理想地从中恢复。

暂时忽略所有不这样做的好理由,我遇到以下情况:

如果我在 App.xaml.cs 的 OnStartup 方法中注册 AppDomain.CurrentDomain.UnhandledException 的处理程序,如下所示...

App.xaml.cs:

protected override void OnStartup(StartupEventArgs e)
{
AppDomain.CurrentDomain.UnhandledException += new
UnhandledExceptionEventHandler(this.AppDomainUnhandledExceptionHandler);

base.OnStartup(e);
}


void AppDomainUnhandledExceptionHandler(object sender, UnhandledExceptionEventArgs ea)
{
Exception e = (Exception)ea.ExceptionObject;
// log exception
}

然后在我的一个 VM 中引发异常,处理程序按预期调用。

到目前为止一切顺利,除了我无法使用这种方法恢复之外,我所能做的就是记录异常,然后让 CLR 终止应用程序。

我真正想做的是恢复,并将控制权交还给主框架虚拟机。 (再次抛开反对这样做的动机)。

因此,通过阅读,我决定在同一个地方为 AppDomain.CurrentDomain.UnhandledException 注册一个事件处理程序,这样代码现在看起来像这样......

protected override void OnStartup(StartupEventArgs e)
{
AppDomain.CurrentDomain.UnhandledException +=
new UnhandledExceptionEventHandler(this.AppDomainUnhandledExceptionHandler);

this.DispatcherUnhandledException +=
new DispatcherUnhandledExceptionEventHandler(DispatcherUnhandledExceptionHandler);

base.OnStartup(e);
}

void AppDomainUnhandledExceptionHandler(object sender, UnhandledExceptionEventArgs ea)
{
Exception e = (Exception)ea.ExceptionObject;
// log exception
}

void DispatcherUnhandledExceptionHandler(object sender, DispatcherUnhandledExceptionEventArgs args)
{
args.Handled = true;
// implement recovery
}

问题是,一旦我注册了 this.DispatcherUnhandledException 的处理程序,就不会调用任何事件处理程序。因此,注册 DispatcherUnhandledExceptionHandler 会以某种方式停用 AppDomain.CurrentDomain.UnhandledException 的处理程序。

有没有人有捕获未处理的 VM 异常并从中恢复的方法?

值得一提的是,框架中没有明确使用线程。

最佳答案

VS 向您显示异常的原因是因为您已将其设置为那样(您明确地这样做了,或者 - 更有可能 - VS 中的默认设置是这样配置的)。您可以通过 Debug->Exceptions 菜单控制 Visual Studio 在调试代码中遇到异常时执行的操作。

你甚至可以让它坏掉,即使你有一个钩子(Hook),这在某些情况下非常方便。

如果您不使用多线程,那么您应该可以使用 DispatcherUnhandledException 事件,因为它会捕获在主 UI 线程上未捕获的所有内容。

关于c# - 在 FrameWork 级别捕获 WPF 中的异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4625825/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com