在之前一直都是使用32bit的作業系統,加上VS2008在這個險惡的環境中奮戰;一直以來也都相安無事(除了自己手殘產生的bug..),然而為了充分利用NB上裝的4G RAM,在幾經掙扎之後,在月黑風高的夜晚,將工作機重新安裝,從原先的W7(32bit)轉換到W7(64bit),作業系統安裝完成之後,就是一連串的application了,重灌的路真是漫長。重灌完成之後趕緊開啟每天都會使用的Visual Studio,測試了簡單的功能,漂亮,果然跟以往使用沒甚麼不同,所以就安心的去睡覺,沒想到事情就這麼發生了..
隔天回到公司繼續進行奮戰,開啟專案之後,趕緊繼續的進行除蟲作業;一個階段之後開始進行測試,程式卻不能正常運作,於是就開始利用我最愛的F8(逐步執行),來看看是在哪邊發生錯誤,怪了,在Form_load中怎麼執行到某一行程式碼之後,就直接把Form的畫面帶出來,不繼續偵錯了?而且該行下面的程式碼全部沒有執行,怎麼會這樣,我真的慌了..Orz 繼續測試之後發現該行的程式碼是有問題的,但是照理來說會顯示exception才對,但在IDE環境中,卻都沒有任何exception的錯誤訊息,趕緊做個簡單的測試程式測試一下,於是寫了下面很簡單的測試程式碼
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Dim i As Integer = 0 Dim j As Integer = 0 MessageBox.Show("Message 1") i = 100 / j MessageBox.Show("Message 2") End Sub執行之後,在輸出視窗中可以看到只有列印出"Message 1"的訊息,之後Form1就跑出來了,"Message 2"就這樣被拋棄了
而除以0應該要產生的OverflowException也沒有發生,真糟;詢問了一些前輩,似乎也沒有發生這樣的情形,所以我覺得應該是安裝過程有問題,所以就移除了Visual Studio,重新安裝,但是重新安裝完之後,甚麼 !! 狀況還是一模一樣,這可不是開玩笑的,難道要我連OS都一起重裝才要放過我嗎..由於極度的不想重裝OS,而且覺得沒道理兩次裝的都有問題,所以就開始努力的爬文,看看是不是有人有相同的情形。
在燒掉了幾個小時,反覆的在調整Visual Studio的設定以及爬文的過程中,終於找到了這篇
Visual Studio doesn't break on unhandled exception with windows 64-bit
裡面提到了這段話
This is a known bug with x64 versions of Windows and the way exceptions are handled. One way to work around this issue while debugging is to go to the Debug -> Exceptions and select 'Thrown' for for the exception types you are interested in. This will stop the debugger when the exception is first hit (and before Windows eats it up).甚麼..!!這真是叫我情何以堪..文中建議到Debug功能表中,去設定Exception的項目,將你想要引發的錯誤類型勾選起來,像是下面這邊的設定
但是這樣也是無法滿足我的需求,因為實在是沒有辦法預測會出現哪些類型的Exception阿,全部勾選的話,在try...catch範圍中的程式碼也會丟出例外狀況的錯誤訊息,這也不是我想要的;接著經過 黑暗執行緒前輩 的提醒,在上面連結中有另外一段話
One VERY important point is that this issue is only on exceptions raised during the Forms.OnLoad event handler (or methods called from within this event handling). 意思是說,這樣的情形只會發生在Form_Load當中,趕緊測試一下,果然相同的程式碼在Button_Click的事件中,就會正常的發出Exception了
有了這樣的結果之後,稍稍的放心了一點,但在Form_Load的事件中,撰寫程式碼的時候要特別留意就是了;假如在Debug階段沒有發現的話,實際編譯出來的執行檔在執行時,一Run到錯誤的程式碼時還是一樣會跳出錯誤訊息,是不至於造成重大影響,但是不留意的話,會不曉得栽在哪邊的..
至於其餘的專案類型呢?經過測試之後,在ASP.Net(Page_load)、Console(Main)專案中是會正常引發Exception的;而Windows Application與WPF Application則是會有這樣的情形,所以,各位朋友要特別留意就是了。另外,在Form_Load中的程式碼去呼叫Sub/Function時,即使你的錯誤是發生在Sub/Function當中,同樣的也是會發生上述相同的狀況喔。
PS:要特別感謝在我焦頭爛額時,提供意見與協助測試的前輩們,Will 保哥、黑暗執行緒、BillChung、hunterpo,乾蝦啦 !



