2012-06-19 68 views
3

與C++異常不同,訪問衝突指示您的應用程序運行時受到損害,因此應用程序的狀態未定義。在這種情況下最好的辦法是退出你的應用程序(通常是因爲崩潰而爲你完成的)。爲什麼發現訪問衝突?

我注意到有可能發現這些例外之一。例如,在Microsoft Visual C++中,您可以使用/EHa__try/__catch來執行此操作。

那麼,你想要捕捉它們的原因是什麼?據我瞭解,你的應用程序無法恢復。

+2

你可能會在你崩潰的時候做一些讓用戶感到不舒服的事情。例如,您可能因任何原因禁用了他們的任務欄。在完成之前,你需要確保它已被顛倒過來。 – chris

+0

但是,如果運行時受到威脅,繼續清理代碼的機率甚至可以發揮作用? – Chimera

+0

我想可能發生的最糟糕的情況是你的應用程序會崩潰。 ;-) – PaulH

回答

6

原因之一可能是編寫故障轉儲文件;你會對它有更多的控制,並能夠寫出你想要的確切類型。例如,在Windows中,您可以撥打MiniDumpWriteDump來執行此操作。

+1

這似乎是一個人在情況下最想做的事情。不過,對於其他人給出了合理的答案+1。此外,一位同事指導我對道格·哈里森的一篇文章的鏡像進行了一些很好的介紹:http://www.360doc.com/content/11/0411/10/6287626_108773107.shtml – PaulH

7

您可以從訪問衝突中恢復。

例如,您可以通過分配一些地址空間(VirtualAlloc)來創建動態數組,但將其指向的內存標記爲不存在。然後,當您嘗試使用某些內存時,會捕獲訪問衝突,映射發生訪問的內存頁面,然後重新嘗試導致違規的指令。

+4

當然,當你做了很深的魔法就像那樣,你和所有其他相關方都必須知道他們做了什麼。否則,會發生[bad stuff](http://blogs.msdn.com/b/oldnewthing/archive/2006/09/27/773741.aspx)。 – delnan

1

我認爲最好能夠優雅地崩潰並讓用戶知道發生了什麼,而不是讓應用程序消失。

1

如果您的應用程序出現訪問衝突,您可能會或可能無法恢復。如果你的應用程序處於未定義的狀態,例如你的堆棧被打破,你就完成了。

從失控指針讀取可能不會損壞您的應用程序,並且您可能會恢復。

無論哪種方式,它正在發生的事實表明,在您的代碼中的錯誤,所以而不是試圖恢復你應該趕上錯誤和轉儲什麼狀態,你可以幫助你調試問題。

+0

不幸的是,我們中的許多人編寫與其他平臺交互的代碼,並且這些錯誤在其他代碼中。如果可能的話,隔離這些並嘗試繼續下去會很好。 – Tim

3

在所有訪問違規後,您的應用程序不能保證穩定。但它可以穩定或經過一些恢復,所以捕捉訪問衝突讓您有機會到:

  1. 通知用戶出現了一些不好的
  2. 讓用戶嘗試保存工作
  3. 嘗試恢復
  4. 日誌診斷信息
  5. 以您想要的方式退出,而不是消失。

這是一個典型的例子,它捕獲一個插件的異常。通過這種方式,主機應用程序(例如Photoshop)可以告訴用戶「插件X崩潰,並且Photoshop不穩定......您應該保存您的工作,然後重新啓動Photoshop。」

請注意,這與C++異常處理不同,它根本不表示不可恢復的錯誤,但更多的是堆棧解繞功能。