[英]Why doesn't calling a null event handler raise an exception?
閱讀此問題后 ,似乎以下代碼應該失敗:
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!";
}
}
這里的問題是Load事件吞噬了你的異常。
此處還有其他關於此問題和網上其他帖子的問題:
簡而言之,在某些情況下(最常提到的原因是在64位Windows上運行的32位.NET程序),任何WinForms表單的Load事件中的異常都將被吞噬。
您可以將Form Load事件包裝在try / catch塊中以捕獲它,並確定如何對其作出反應。
簡而言之2:代碼確實會引起您所期望的空引用異常,您只是沒有看到它
您如何確定此代碼運行正常? 這個代碼很可能會引發一個異常,然后被Windows Forms Runtime代碼吞沒。 有幾個原因導致調試器/運行時可以靜默處理這種異常吞咽
我會嘗試調試這個或代碼或禁止在委托調用下放置Messagebox.Show
行,看看它是否執行。
你確定代碼什么都不做 ?
我得到一個NullReferenceException
,當我試試這個:
class Program
{
static void Main(string[] args)
{
EventHandler myhandler = null;
myhandler(null, null);
}
}
也許您的代碼永遠不會被執行(例如,您的Form1_Load
事件處理程序未被調用),或者您的異常可能被吞下(例如,通過不同的線程)?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.