Application.ThreadException事件未捕获绑定属性的Set方法中的异常

冰雹18

似乎在属性的Set方法中发生的异常不会冒泡到应用程序的ThreadException事件。

我们将该事件与AppDomain.CurrentDomain.UnhandledException事件一起使用,以捕获应用程序中发生的任何意外情况。将异常详细信息写入日志,以便我们的支持和开发团队可以更好地评估问题。可悲的是,在这种特殊情况下,看起来“全部捕获”不足。

在StackOverflow上有几个类似的问题,但是没有答案解决全局异常处理无法捕获异常的问题。我已经知道我们可以修复它,因此不会发生任何异常。我们可以向每个设置器添加一个TryCatch块。我们可以将BindingComplete事件添加到每个数据绑定中,并以这种方式获取异常。但是,所有这些都违背了具有全局异常处理功能的目的,该功能在任何其他情况下都可以完美运行。

要重现此问题,只需创建带有文本框的表单,将文本框绑定到属性,然后在属性的set方法中引发异常。将ThreadException和UnhandledException事件添加到program.cs。运行该程序,然后在文本框中键入以触发异常。调试器将在异常发生时中断,按继续(F5)键,使异常像在调试器外部一样冒泡。任何正常的异常都会在这些事件中结束,但事实并非如此。

Form1.cs

    public Form1()
    {
        InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        textBox1.DataBindings.Add("Text", this, "TestValue", true, DataSourceUpdateMode.OnPropertyChanged);            
    }

    private string _TestValue = "";
    public string TestValue
    {
        get{return _TestValue;}
        set
        {
            _TestValue = value;
            throw new Exception("Something bad happened in here");
        }
    }

Program.cs

static class Program
{
    /// <summary>
    /// The main entry point for the application.
    /// </summary>
    [STAThread]
    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);

        Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);
        Application.ThreadException += ThreadExceptionHandler;
        AppDomain.CurrentDomain.UnhandledException += new System.UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);
        TaskScheduler.UnobservedTaskException += TaskScheduler_UnobservedTaskException;

        Application.Run(new Form1());
    }

    private static void ThreadExceptionHandler(object sender, System.Threading.ThreadExceptionEventArgs args)
    {
        try
        {
            //RR.Common.ErrorLogRt.WriteError(args.Exception.StackTrace.ToString(), args.Exception.Message.ToString(), true);
            MessageBox.Show(args.Exception.Message);
        }
        catch
        {
            MessageBox.Show("Error writing to exception log. This program will now terminate abnormally.");
            Application.Exit();
        }
    }

static void CurrentDomain_UnhandledException(object sender, System.UnhandledExceptionEventArgs e)
    {
        try
        {
            if (e != null)
            {
                Exception ex = e.ExceptionObject as Exception;
                //RR.Common.ErrorLogRt.WriteError(ex.StackTrace.ToString(), ex.Message.ToString(), true);
                MessageBox.Show(ex.Message);
            }
            else
            {
                MessageBox.Show("Unhandled Error: " + e.ToString());
            }
        }
        catch
        {
            MessageBox.Show("Error writing to exception log. This program will now terminate abnormally.");
            Application.Exit();
        }
    }


 static void TaskScheduler_UnobservedTaskException(object sender, UnobservedTaskExceptionEventArgs e)
    {
        try
        {
            if (e != null && e.Exception != null && e.Exception.InnerException != null)
            {
                //The unobserved exception is always the same, The actual exception that cause it will be the inner exception.
                Exception ex = e.Exception.InnerException;
                MessageBox.Show(e.Exception.Message);
                //RR.Common.ErrorLogRt.WriteError(ex.StackTrace.ToString(), ex.Message.ToString(), true);
            }
            else
            {
                MessageBox.Show("Unhandled Error: " + e.ToString());
            }


        }
        catch
        {
            MessageBox.Show("Error writing to exception log. This program will now terminate abnormally.");
            Application.Exit();
        }
    }



}
菲尔达

Binding.FormattingEnabled属性的备注

将此属性设置为true还可以启用错误处理行为,并引发BindingComplete事件。通过检查BindingCompleteEventArgs参数的BindingCompleteState属性,此事件的处理程序可以根据绑定过程中的成功,错误或异常采取适当的措施。

涉及的代码

internal bool PushData(bool force)
{
    Exception ex = null;
    if (!force && this.ControlUpdateMode == ControlUpdateMode.Never)
    {
        return false;
    }
    if (this.inPushOrPull && this.formattingEnabled)
    {
        return false;
    }
    this.inPushOrPull = true;
    try
    {
        if (this.IsBinding)
        {
            object value = this.bindToObject.GetValue();
            object propValue = this.FormatObject(value);
            this.SetPropValue(propValue);
            this.modified = false;
        }
        else
        {
            this.SetPropValue(null);
        }
    }
    catch (Exception ex2)
    {
        ex = ex2;
        if (!this.FormattingEnabled)
        {
            throw;
        }
    }
    finally
    {
        this.inPushOrPull = false;
    }
    if (this.FormattingEnabled)
    {
        BindingCompleteEventArgs bindingCompleteEventArgs = this.CreateBindingCompleteEventArgs(BindingCompleteContext.ControlUpdate, ex);
        this.OnBindingComplete(bindingCompleteEventArgs);
        return bindingCompleteEventArgs.Cancel;
    }
    return false;
}

如您所见,将第4个参数传递为true:DataBindings.Add("Text", this, "TestValue", true负责在内部捕获异常PushData并将其传递给BindingComplete事件。除了启用格式设置外,没有其他方法(除外AppDomain.CurrentDomain.FirstChanceException)在其他地方查找异常BindingComplete

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

未处理的异常没有被Application.ThreadException捕获?

来自分类Dev

异常未显示在Application Insights中

来自分类Dev

从Application.Run()捕获异常

来自分类Dev

Application 类静态成员的绑定属性

来自分类Dev

错误:线程“ JavaFX Application Thread”中的异常

来自分类Dev

对Application Insights Analytics中的事件进行配对

来自分类Dev

Application Insights – 捕获未触发的 ASMX WebMethod Names 代码

来自分类Dev

My.Application启动事件

来自分类Dev

发生异常后,Application Insights RequestTelemetry未显示在请求中

来自分类Dev

Application_End未运行

来自分类Dev

Application_AcquireRequestState未执行

来自分类Dev

在ApplicationTelemetry上下文中的Application Insights设置用户未显示在事件详细信息中

来自分类Dev

在React Native Application中接收数据通知时未触发'RNFirebaseBackgroundMessage'事件

来自分类Dev

application:openURL:方法未被调用

来自分类Dev

Application.WorksheetFunction.Match方法

来自分类Dev

Application.Ontime取消无法到达对象“ Application”的方法“ ONTIME”

来自分类Dev

Azure Application Insights中的会话

来自分类Dev

application.properties中的变量

来自分类Dev

oncreate Application 类中的 IllegalStateException

来自分类Dev

全局异常过滤器或Application_Error都不捕获未处理的异常

来自分类常见问题

Android:onDestroy()或Application类中的类似方法

来自分类Dev

在Android中获取Application实例的正确方法

来自分类Dev

wpf中Application.DoEvents()的替代方法

来自分类Dev

Prolog中未捕获的异常

来自分类Dev

Firefox中未捕获的异常

来自分类Dev

Xcode中未捕获的异常

来自分类Dev

取消绑定android.app.Application中的服务

来自分类Dev

失败的承诺被Application.onerror函数捕获

来自分类Dev

失败的承诺被Application.onerror函数捕获

Related 相关文章

  1. 1

    未处理的异常没有被Application.ThreadException捕获?

  2. 2

    异常未显示在Application Insights中

  3. 3

    从Application.Run()捕获异常

  4. 4

    Application 类静态成员的绑定属性

  5. 5

    错误:线程“ JavaFX Application Thread”中的异常

  6. 6

    对Application Insights Analytics中的事件进行配对

  7. 7

    Application Insights – 捕获未触发的 ASMX WebMethod Names 代码

  8. 8

    My.Application启动事件

  9. 9

    发生异常后,Application Insights RequestTelemetry未显示在请求中

  10. 10

    Application_End未运行

  11. 11

    Application_AcquireRequestState未执行

  12. 12

    在ApplicationTelemetry上下文中的Application Insights设置用户未显示在事件详细信息中

  13. 13

    在React Native Application中接收数据通知时未触发'RNFirebaseBackgroundMessage'事件

  14. 14

    application:openURL:方法未被调用

  15. 15

    Application.WorksheetFunction.Match方法

  16. 16

    Application.Ontime取消无法到达对象“ Application”的方法“ ONTIME”

  17. 17

    Azure Application Insights中的会话

  18. 18

    application.properties中的变量

  19. 19

    oncreate Application 类中的 IllegalStateException

  20. 20

    全局异常过滤器或Application_Error都不捕获未处理的异常

  21. 21

    Android:onDestroy()或Application类中的类似方法

  22. 22

    在Android中获取Application实例的正确方法

  23. 23

    wpf中Application.DoEvents()的替代方法

  24. 24

    Prolog中未捕获的异常

  25. 25

    Firefox中未捕获的异常

  26. 26

    Xcode中未捕获的异常

  27. 27

    取消绑定android.app.Application中的服务

  28. 28

    失败的承诺被Application.onerror函数捕获

  29. 29

    失败的承诺被Application.onerror函数捕获

热门标签

归档