2011-03-14 57 views
0

是否有任何可能的方法來自動附加所有字符串/等到我選擇的文本框(或其他形式)?現在爲了在Main類之外的任何類中執行此操作,我必須將其路由到它,然後使用Main類來發布它。C#方便懶惰的異常處理

澄清(改變): 我不再希望只是處理異常。我真的只想從我的程序中的任何地方傳遞字符串/文本,而不必將它傳遞給MainWindow。

namespace MyProgram 
{ 
    public partial class MainWindow : Window 
    { 
     Main goes here... 
    } 

} 

namespace People 
{ 
    public class Worker 
    { 
     public void printToLog() 
     { 
      textBoxErrorlog.AppendText("Message...."); 
     } 
    } 
} 

上面的代碼將不起作用。我將不得不將字符串返回到MainWindow類並從那裏追加(bc textBoxErrorlog不存在於Worker中)。我想跳過這一步,只是從Worker類發佈它。

+4

你是什麼意思 「所有異常」?你的意思是所有未處理的異常?最簡單的方法是不抓住它們,然後你的應用程序將崩潰,你將不得不修復你的bug。 – 2011-03-14 17:10:30

+2

添加代碼!告訴我們你在做什麼。說「路由到它」並沒有畫出一幅清晰的圖畫。 – RQDQ 2011-03-14 17:14:22

回答

4

你的問題很模糊。但是我有一種感覺,你會發現有趣/有用的這些事件:

Application.ThreadException 
AppDomain.CurrentDomain.UnhandledException 

編輯您添加的代碼之後:

一般來說它的壞趕上Exception。在你的情況下,我會建議掛鉤AppDomain.CurrentDomain.UnhandledException並在該處理程序附加到MainWindow的例外日誌文本框。

AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException); 
    void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e) 
    { 
     if (!e.IsTerminating) 
     { 
      MainWindow mw = GetRefToTheMainWindowSomehow(); 
      mw.AppendException(e.ExceptionObject); 
     } 
    } 

而且在主窗口:

internal delegate void AppendExceptionDelegate(Exception e); 

    public void AppendException(Exception e) 
    { 
     if (this.InvokeRequired) 
     { 
      this.Invoke(new AppendExceptionDelegate(AppendException), new[] { e }); 
     } 
     else 
     { 
      this._textBox.Text += e.Message; 
     } 
    } 
+0

我更新了我的問題。我正在尋找一種更簡單的方式來做事。感謝您的幫助。 – PiZzL3 2011-03-14 23:38:59

+0

我不知道,如果你可以得到比這更簡單。由於GUI線程和控件在WinForms中的工作方式,AppendException方法很複雜。 – 2011-03-15 01:02:40

+0

WPF/XAML怎麼樣?我沒有使用WinForms。有沒有辦法傳遞一個字符串,而不是所有的異常?從上面的代碼看來,我只能在例外情況下使用它。 – PiZzL3 2011-03-15 02:40:59

1

你可以爲Log4Net創建一個自定義appender並讓它做到這一點。除此之外,您需要捕獲異常並將它們編組回到UI線程。

0

您可以利用從AppDomain接線UnhandledException事件並將所有未處理的異常路由到您喜歡的任何地方。

AppDomain currentDomain = AppDomain.CurrentDomain; 
currentDomain.UnhandledException += (sender, args) => { /* Write To Wherever */ }; 

我會建議充實了這一點,使用一個真正的處理程序等,但它給你的想法。