处理Prism 4模块中的异常

时间:2012-10-30 16:59:00

标签: c# wpf mvvm prism mef

我在这里讨论了很多关于这个话题的线索但都没有成功。似乎在我们的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)
        { }
    }

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

有没有人有这方面的经验?

2 个答案:

答案 0 :(得分: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的项目属性中执行此操作。

答案 1 :(得分:0)

尽管不完美,但是您可以通过覆盖InitializeModules来捕获在模块初始化期间发生的异常。

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

        // Handle Exception
    }
}

抛出ModuleInitializeException可能会被捕获;内部异常将包含原始异常。

不幸的是,InitializeModules或模块管理器将执行自己的日志记录,就我而言,我宁愿自己做一下,以避免在日志中显示ModuleInitializeException