我在这里讨论了很多关于这个话题的线索但都没有成功。似乎在我们的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)
{ }
}
问题似乎是模块中发生的未处理异常。 它们不会被上面的代码捕获,它们会导致应用程序崩溃而不记录或显示任何类型的消息。
有没有人有这方面的经验?
答案 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
。