2

我在这里浏览了很多关于这个主题的主题,但都没有成功。似乎在我们的 WPF 应用程序的 App.xaml.cs 中,处理 DispatcherUnhandledExceptions 和 AppDomain.CurrentDomain.UnhandledException 并不能捕获所有内容。

在这个特定的例子中,我们有 7 个棱镜模块。我的异常处理代码如下(UnhandledException 几乎相同):

private void OnDispatcherUnhandledException(object sender, DispatcherUnhandledExceptionEventArgs e)
    {
        try
        {
            var ex = e.Exception.InnerException ?? e.Exception;
            var logManager = new LogManager();
            logManager.Error(ex);


            if (!EventLog.SourceExists(ex.Source))
                EventLog.CreateEventSource(ex.Source, "AppName");
            EventLog.WriteEntry(ex.Source, ex.InnerException.ToString());

            var emb = new ExceptionMessageBox(ex);
            emb.ShowDialog();
            e.Handled = true;

        }
        catch (Exception)
        { }
    }

问题似乎是模块中发生的未处理异常。 它们没有被上面的代码捕获,它们会导致应用程序崩溃而不记录或显示任何类型的消息。

有人对此有经验吗?

4

2 回答 2

2

这就是我们在 Prism 应用程序中为捕获异常所做的(它几乎可以捕获所有内容):

static class Program
{
    [STAThread]
    static void Main()
    {
        try
        {
             App app = new App();
             app.InitializeComponent();
             app.Run();
        }
        catch (Exception e)
        {
             // Log here
             // Custom error message.
        }
     }
 }

为此,您必须将“启动对象”更改为此类。您可以在 shell 的项目属性中执行此操作。

于 2012-11-01T05:49:35.367 回答
0

虽然并不完美,但您可以通过覆盖来捕获模块初始化期间发生的异常InitializeModules

protected override void InitializeModules()
{
    try
    {
        base.InitializeModules();
    }
    catch (ModuleInitializeException e)
    {
        Exception innerException = e.InnerException;

        // Handle Exception
    }
}

AModuleInitializeException被抛出,可以被困住;内部异常将包含原始异常。

不幸InitializeModules的是,或者模块管理器将执行自己的日志记录,在我的情况下,我更愿意自己做以避免ModuleInitializeException出现在日志中。

于 2019-07-02T19:00:01.487 回答