为什么不调用null事件处理程序引发异常?

时间:2013-03-05 20:49:37

标签: c# event-handling thread-safety

阅读this question后,以下代码似乎会失败:

private void Form1_Load(object sender, EventArgs e)
{
   EventHandler myHandler = null;
   myHandler(this, null);
}

但是当我运行它时,它工作得很好(并且什么都不做)。该代码的行为与以下内容有何不同?

private void Form1_Load(object sender, EventArgs e)
{
   EventHandler myHandler = null;
   EventHandler myCopy = myHandler;
   if (myCopy != null)
   {
      myHandler(this, null);
   }
}

编辑:根据Lasse V. Karlsen的回答,以这种方式捕捉异常是有效的:

private void Form1_Load(object sender, EventArgs e)
{
   try
   {
      EventHandler myHandler = null;
      myHandler(this, null);
   }
   catch (Exception ex)
   {
      this.Text = "Exception!";
   }
}

3 个答案:

答案 0 :(得分:6)

这里的问题是Load事件正在吞噬您的异常。

此处还有其他关于此问题和网上其他帖子的问题:

简而言之,在某些情况下(最常提到的原因是在64位Windows上运行的32位.NET程序),将吞下WinForms表单的Load事件中的任何异常。

您可以将表单加载事件包装在try / catch块中以捕获它,并确定如何对其做出反应。

简而言之2:代码确实会引起您所期望的空引用异常,您只是没有看到它

答案 1 :(得分:2)

您如何确定此代码运行正常?这个代码很可能会引发一个异常,然后被Windows Forms Runtime代码吞没。有几个原因导致调试器/运行时

可以无声地处理这种异常吞咽

我会尝试调试此代码或禁止在委托调用下放置Messagebox.Show行并查看它是否执行。

答案 2 :(得分:0)

您确定代码什么都不做

在我尝试时获得NullReferenceException

class Program
{
    static void Main(string[] args)
    {
        EventHandler myhandler = null;
        myhandler(null, null);
    }
}

也许您的代码永远不会被执行(例如,您的Form1_Load事件处理程序未被调用),或者您的异常被吞下(例如,通过其他线程)?