2012-11-16 67 views
2

我開始問這個問題here,並得到了非常豐富的答案,但仍然無法解決問題。這個問題已經被封閉,因爲這是一個已知的問題。我知道這是一個已知的問題:我的問題是我能做些什麼呢?難怪VS2012異常吞嚥噩夢

總結:

  1. VS調試吞下未處理的Form_Load事件(或由此的任何呼叫)發生的例外在Windows 64位系統調試時(在我的情況下,Win 7的64位)。就目前而言,這使得VS作爲開發環境無用
  2. 一個建議是將代碼移入構造函數而不是FOrm_Load事件。我不想這樣做,因爲它會將代碼移出視覺,進入「設計器創建的」模塊;這些模塊充滿了我無法改變的代碼;我不相信設計師不會消除或更改我放在那裏的代碼。
  3. 另一個建議是通過在初始過程中插入一些代碼(例如Sub Main),將未處理的異常指向虛擬空異常處理程序。 這個作品。這裏的問題是Sub Main只能在啓動時執行,如果我關閉應用程序框架。然後,我無法運行具有「直到主窗體或上一窗體關閉」的生命週期的應用程序。
  4. 想法我有一個啓動窗體運行,並在正確的時間運行(即Form_Load之前)一個子主。因此,我仍然可以使用應用程序框架,有這個特殊的代碼之前運行任何其他。我可能在這裏錯了。無論如何,我已經改變了這個表單的代碼,並且Main不再運行 - 如果它曾經做過(Form_Load首先運行,並且我們有同樣的問題)。嘗試將代碼移入Form_Load - 但它本身會導致錯誤。
  5. 有一個假設的修補程序(KB976038)。我申請了(重新啓動需要):但現在,而不是被吞下的異常,我得到一個vshost.exe應用程序錯誤,仍然無法調試我的代碼。令人沮喪的是,一旦我確定應用程序錯誤,我就會看到VS調試器顯示通常的未處理異常框 - 但它在大約1/10秒內消失。

那麼我有什麼選擇?

這裏的共同點是雖然我是一位經驗豐富的程序員,習慣於在VB.NET和VB6中完成任務,並且能夠理解導致此問題的詳細解釋;

所有可能的措施是真的超出我的能力,並介紹了太多的問題,我可能甚至不知道。我不禁想着 - 爲什麼我不能輕易進行編碼,並且使用我可以信賴的調試器來處理異常,從而處理不可避免的編碼錯誤我會 make?目前,我覺得如果(從那些比我更專家的建議)我以某種方式讓VS正確捕捉未處理的異常並打破它們,那麼今天將只有。誰知道我明天或下週在代碼中做的事情是否可能不會破壞精心構建的安全網,使得VS本身的行爲正常目前

我自由地承認,在我的.NET專業知識中,我不應該在現階段允許在構造函數/設計器創建的代碼附近。我只想完成一些東西!所以我的選項是這樣的:

  • 瞭解所有的核心內容,以便我永遠不會破解這個問題的解決方案。如果不是幾年,這需要幾個月;或
  • 放棄並返回到XP上的VS2008 Express;或
  • 說服該公司使用Windows 7 64,並將Windows 7 32作爲開發操作系統。

歡迎任何意見或建議!

編輯: 正如下面@roadwarrior建議,這裏是在回答該建議的解決原來的問題,什麼我已經跟他們發現:

項目+屬性,生成選項卡,將Platform目標更改爲AnyCPU

已經設置了這種方式,我無法更改它。嘗試將TargetCPU從「AnyCPU」改爲x86或64位 - 無效。

調試+異常,勾選時拋出框CLR例外

使運行/儘快測試的噩夢,我開始刻意的異常處理(我做了很多)。無論是否處理,每個異常都會導致「停止」。

寫嘗試在Load事件處理程序

這個/ catch語句是不會有太大的樂趣無論是。在這個發展階段,我想看到導致問題的路線。總是討厭VB6中的調試代碼,它在On Error的範圍之內轉到某個程序中,在調用堆棧中執行了6個步驟;我不想在我自己的項目中以這種方式開始!

使用 Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException) 中,使得在消息循環 的異常捕獲未在調試模式下禁用了Main()方法。然而,這個設置使得所有未處理的異常難以調試,ThreadException事件幾乎沒有用處。

我不明白最後一句中的評論。但像這樣的工作。我所做的,由Neolisk在回答我剛纔的問題提出,是這樣的,在Sub主營:

Public Sub Main() 
    AddHandler Application.ThreadException, AddressOf ThreadExceptionHandler 
    Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException) 
    AddHandler AppDomain.CurrentDomain.UnhandledException, AddressOf UnhandledExceptionHandler 

    Form1.Show() 
End Sub 

Friend Sub ThreadExceptionHandler(sender As Object, e As System.Threading.ThreadExceptionEventArgs) 

End Sub 

Friend Sub UnhandledExceptionhandler(sender As Object, E As System.UnhandledExceptionEventArgs) 
End Sub 

這是我的版本的neolisk代碼 - 必須改變它作爲我的版本VS /的。 NET(2012,4.5)這兩個處理程序需要具有不同的簽名。 兩個問題:

一)我不能讓一個小組主要在啓動時執行沒有取消勾選「啓用應用程序框架」。一旦我這樣做了,Form1.Show就會顯示錶單,我們會看到Sub Main的結尾,並且表單會在應用程序關閉時立即消失。我已經顛覆了應用程序設置窗口的「關機模式」設置,並且不理解如何重新獲取它。

B)此代碼的工作,但我很少有想法爲什麼如何,無論它涵蓋了所有的例外,它是如何涉及到什麼我可以決定在調試/例外對話框,勾選/勾去掉,或者在調試時或運行時可能遇到的其他問題副作用。

請考慮您的代碼是否真的屬於Load事件處理程序。這是非常罕見的需要它,然而它受歡迎VB6程序員 其中Load是一個大問題。你只需要加載時,你是 感興趣的實際窗口大小後的用戶首選項和 自動縮放應用。其他的一切都屬於構造函數。

不夠公平。作爲一個前VB6程序員,我習慣於使用Form_Load,但讓我們繼續學習新事物,並將代碼移動到窗體的New()構造函數中(讓我們希望我永遠不會有一些代碼確實是在_Load中事件)。現在,當執行遇到問題行時,至少會顯示一個異常對話框:但它位於新窗口的頂部「無源可用(crlf)調用堆棧只包含外部代碼」。在這個特殊情況下,代碼中的錯誤是可以從我在這裏看到的(這是一個愚蠢的錯字)調試 - 但是當事情變得更復雜時調試就會變成一場噩夢:沒有機會看到什麼狀態是什麼。

總評:

冉一個Win7的32位機,我們有(不是我 機)在這個項目上,並且有沒有任何問題。這是我首選的 解決方案 - 只需停止使用Win7 64位進行開發即可。

2.沿着「你很幸運,你有一個調試器」的評論是 有趣,但沒有幫助。這是VS2012,據推測這是一個 開發環境,有一個調試器可以工作,而我們 將不得不支付£££。我已經編程了足夠長的時間到 知道什麼時候我知道我在做什麼,當我搞亂 的東西,我不應該因爲我不明白它。我所特別不明白的不是底層結構(I 在ZX81機器碼上切齒,不想回去那裏...),但是VS本身就是 。我很高興瞭解更多關於如更改 VS中的異常處理程序,因爲我需要,但肯定不想 在那裏下潛,無知,作爲我的發展基礎 環境。

+0

我猜你還年輕。調試器是一種現代發明。我們以前的開發人員過去必須扮演'移動站點'來查找錯誤,或者使用日誌文件。歡迎來到1980. – Beth

+0

爲什麼不直接調用form_load中的代碼?順便說一句,在大多數情況下,form_load不是代碼的正確位置。 – igrimpe

+0

將代碼放入構造函數中不會**將其移出「視線之外」。鍵入「Sub New」並按Enter鍵。 –

回答

1

關於您的問題#3:嘗試使用ShowDialog()而不是Show(),它使應用程序運行,直到此(主)表單關閉。我們有一個像這樣運行的生產應用程序。如果你沒有主表單,你可能想重新考慮你的設計。

在退出x64之前,請考慮從2008 R2開始,沒有32位版本的操作系統。這意味着如果你要在應用程序服務器上運行你的軟件,那將是x64,所以你必須適應這一點。

+0

感謝您的單挑。當我重新開始工作時,我會嘗試使用ShowDialog。在32/64位問題上;我將不得不進一步閱讀。因爲AFAIK這個問題是一個調試問題:在部署時,應用程序會像您期望的那樣尖叫未處理的異常。那麼,AFAIK在這個時候,我可以在32位環境下開發(無需任何調試),但構建到64位版本?我可能會覺得這是無稽之談,但你讓我思考。 – sebt

+0

@sebt:對。您可以隨時編輯並繼續。但是,對於相同的組件,我對32位仿真和本機64位具有不同的行爲。所以你可能無法解決所有問題。 – Neolisk

2

您的問題已作爲重複被關閉,而不是因爲這是一個已知的問題。 Hans Passant對original question有一個很好的回答,它討論了可能的解決方法。

請讓我們知道各種解決方法中的哪些位是「硬核」,我會盡量提供簡單的解釋。實際上,我認爲您可以進一步探討這個問題,因爲這會提高您對what happens under the hood的理解。