2013-10-10 46 views
1

我有一段這樣的代碼。如何處理來自外部的對象事件內發生的異常?

class Facebook 
    { 
     WebBrowser wb = new WebBrowser(); 
     public bool isDone = false; 
     public Facebook() 
     { 
      wb.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(wb_DocumentCompleted); 
     } 
     public void Navidate(string URL = "http://www.facebook.com") 
     { 
      wb.Navigate(URL); 
     } 
     public void wb_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) 
     { 

      WebBrowser wb = sender as WebBrowser; 
      if (wb != null && wb.StatusText.Contains("404")) 
      { 
       // i want to throw this exception to outside how ? 
       throw new ServerNotFound("Error 404"); 
      } 
      else 
      { 
       isDone = true; 
      } 
     } 
    } 
    public class ServerNotFound : Exception 
    { 
     public ServerNotFound(string Message) 
      : base(Message) 
     { 

     } 

在這裏你可以看到網頁瀏覽器事件可引發異常 我要處理這個異常是這樣。

static class Program 
    { 

     [STAThread] 
     static void Main() 
     { 
      try 
      { 
       Facebook fb = new Facebook(); 
       fb.Navidate(); 
       do 
       { 
        Application.DoEvents(); 
       } 
       while (!fb.isDone); 
      } 

      catch (ServerNotFound ex) 
      { 
       // i want to handle that exception here ? 
       MessageBox.Show(ex.Message); 
      } 
     } 
    } 

你能幫我嗎?它因事件而不工作。

+0

「Navidate」?不工作是什麼意思?發佈例外的詳細信息。 –

+0

您正在通過顯示錯誤消息來處理異常。對我來說目前還不清楚你想要什麼 – Jehof

+0

啊..我的錯誤,現在我想我修好了。希望這是可以理解的。 –

回答

1

DocumentCompleted事件在與主應用程序不同的線程中觸發。如果在調試時打開Visual Studio的Threads窗口,可以看到這一點。您不能從一個線程向另一個線程拋出異常。

如果您使用的是WPF或Windows窗體,但假設使用後者,則應該使用表單或控件上的Invoke方法來更新UI或打開消息框,而不是嘗試拋出一個例外。

+0

是的,我同意我在另一個線程上工作,但我想知道是否有解決方案?獲得慾望結果的最佳解決方案是什麼? 甚至在邏輯上稍作修改。 –

+0

閱讀答案。 –

相關問題