在之前一直都是使用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,乾蝦啦 !