4
試圖再次問我的問題 - 上次它搞砸了。C#winforms不會在特定情況下捕獲異常
這是我的示例代碼:
小的形式,即只包含按鈕,組合框:
public partial class question : Form { public question() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { comboBox1.DataSource = new List<string>() { "a", "b", "c" }; } private void comboBox1_SelectedIndexChanged(object sender, EventArgs e) { MessageBox.Show("In comboBox1_SelectedIndexChanged"); throw new Exception(); } }
項目的
Program
類調用question
形式和處理異常:class Program { static void Main(string[] args) { try { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); // Add the event handler for handling UI thread exceptions to the event. Application.ThreadException += new ThreadExceptionEventHandler(MyCommonExceptionHandlingMethod); // Set the unhandled exception mode to force all Windows Forms errors to go through // our handler. Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException); // Add the event handler for handling non-UI thread exceptions to the event. AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException); Application.Run(new question()); } catch (Exception ex) { Console.WriteLine(ex.Message + "3"); } } private static void MyCommonExceptionHandlingMethod(object sender, ThreadExceptionEventArgs t) { Console.WriteLine(t.Exception.Message + "1"); } private static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e) { Console.WriteLine(((Exception)e.ExceptionObject).Message + "2"); } }
現在,當點擊按鈕時,事件「SelectedIndexChanged」上升(並且出現消息框)但是該例外被忽略。只有當用戶手動選擇組合框中的另一個索引時,纔會處理異常。
問題是,如何處理這些異常呢?
設我明白這一點。您的基於控制檯的應用程序和winForm是兩個獨立的應用程序,並且您想從基於控制檯的應用程序運行winFrom應用程序 - 是嗎? –
@YawarMurtaza謝謝。不是兩個分開的應用程序。只是應用程序的主要部分是控制檯應用程序(實際上總是這樣)。沒關係。 – Yehezkel
好的 - 我已經創建了你的代碼的確切副本。運行時永遠不會到達「Console.WriteLine(ex.Message +」3「);」聲明無論在winForm中做了什麼。必須與Application.Run()方法有關,它會在Main方法運行的同一線程上爲winForm應用程序創建一個新的消息循環。讓我看看在這種情況下是否可以找到異常情況。 –