在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.MessageUnhandledExceptionEventHandler返回这个:

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

谢谢你的帮助。

在c# WPF中无法捕获未处理的异常消息

在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)]