在c# WPF中无法捕获未处理的异常消息
本文关键字:未处理 异常 消息 WPF | 更新日期: 2023-09-27 18:08:35
我使用AppDomain。UnhandledException事件捕获未处理的异常。我在示例中使用MessageBox.Show()
而不是Console.WriteLine
;
public static void Main()
{
AppDomain currentDomain = AppDomain.CurrentDomain;
currentDomain.UnhandledException += new UnhandledExceptionEventHandler(MyHandler);
try
{
throw new Exception("1");
}
catch (Exception e)
{
MessageBox.Show("Catch clause caught : " + e.Message);
}
throw new Exception("2");
}
static void MyHandler(object sender, UnhandledExceptionEventArgs args)
{
Exception e = (Exception) args.ExceptionObject;
MessageBox.Show("MyHandler caught : " + e.Message);
}
这个例子说输出应该是:
// The example displays the following output:
// Catch clause caught : 1
//
// MyHandler caught : 2
相反,我的ex.Message
在UnhandledExceptionEventHandler
返回这个:
MyHandler caught : 'The invocation of the constructor on type 'FlashMaps.MainWindow' that matches the specified binding constraints threw an exception.' Line number '4' and line position '9'.
当我期望它返回示例显示的内容时:
MyHandler caught : 2
谢谢你的帮助。
在WPF中,如果在通过XAML实例化 ui元素(包括windows)时发生异常,框架的XAML/BAML引擎会创建一个自己的异常,并将原始异常放入其InnerException属性。
因此,要获得完整的异常信息,您可以在异常处理程序中执行以下类似操作: try
{
...
}
catch (Exception ex)
{
string message = "";
string formatString = "{0}: {1}";
do
{
message += string.Format(formatString, ex.GetType(), ex.Message);
ex = ex.InnerException;
formatString = "'n Inner {0}: {1}";
}
while (ex != null);
MessageBox.Show(message);
}
这里以捕获块形式给出的示例可以以相同的方式应用于UnhandledExceptionEventHandler。
您的代码未以完全信任方式运行。添加方法
的权限[SecurityPermission(SecurityAction.Demand, Flags = SecurityPermissionFlag.ControlAppDomain)]