2008-10-28 44 views
2

我們正在嘗試更新我們的應用程序,以便將其提交給Vista認證。部分要求是僅處理已知的異常,並使Windows錯誤報告處理所有未處理的異常。應用程序關閉和Windows錯誤報告

我們在我們的應用程序中訂閱了一個全局異常處理程序(訂閱Application.ThreadException事件),並且在那裏我們對已知異常執行某些處理,但是如果異常未知,我們希望拋出該應用程序終止並WER來處理。

如果我們重新拋出然後調用堆棧被重新創建,我們無法看到這樣做並維護調用堆棧。

我們已經看過終止通過Environment.FailFast(),但我們不認爲這給出了我們需要的異常信息。

我們是否錯過了某些明顯的東西?

回答

1

爲什麼不只是拋出一個新的異常並將InnerException屬性設置爲未處理的屬性?默認的StackTrace屬性會將兩個跟蹤連接在一起。

請記住,如果您正在從WinQual中檢索到的內存轉儲進行調試,那麼它將成爲本機異常,無論如何都會被困住。幾乎總是可以回溯本機堆棧並檢索托管的異常,如果有符號可用,通常很容易找出問題所在。無論如何,在這種情況下,託管異常的堆棧跟蹤將是多餘的。

+0

是的,這實際上是我們開始的路線。我們擔心WinQual會將所有這些異常看作是相同類型(新的外部異常),並將它們歸類爲同一問題,但我們需要進一步調查這一點。 – Graham 2008-10-28 15:06:47

-1

是的,正如馬克所說的,只是使用THROW並且原始異常將被重新拋出並且保留了堆棧跟蹤信息。

一個THROW E會重新啓動整個異常堆棧,丟失原來的堆棧信息。通常情況下,這不是你想要的。

另一種方法是,您可以拋出一個新的異常並將原始異常添加爲內部異常。然後你的新例外可以增加額外的信息。

0

是的,但我們是在Application.ThreadException全局處理程序中,而不是一個catch塊,所以我們不能只是調用throw,我們必須拋出e.Exception。