我創建了一個包含許多實用程序函數的庫來執行某些任務並將其放入它自己的DLL中。Debug.Assert正在導致我的應用程序退出
在這個庫的所有方法中,我放置了Debug.Assert語句來驗證應用程序的狀態。
問題是,當Assert被觸發(條件爲false)時,它會顯示對話框,單擊「Abort」就會導致使用此DLL的整個應用程序崩潰。
這就帶來兩個問題:
這能避免?我希望這會拋出一個異常,而不會退出應用程序。
DLL怎麼會導致加載它的應用程序退出?這不是安全漏洞嗎?
由於
我創建了一個包含許多實用程序函數的庫來執行某些任務並將其放入它自己的DLL中。Debug.Assert正在導致我的應用程序退出
在這個庫的所有方法中,我放置了Debug.Assert語句來驗證應用程序的狀態。
問題是,當Assert被觸發(條件爲false)時,它會顯示對話框,單擊「Abort」就會導致使用此DLL的整個應用程序崩潰。
這就帶來兩個問題:
這能避免?我希望這會拋出一個異常,而不會退出應用程序。
DLL怎麼會導致加載它的應用程序退出?這不是安全漏洞嗎?
由於
如果你想有一個異常拋出,你爲什麼不只是拋出一個異常?
變化
Assert(var);
到
if(!var)
throw new Exception("var was false");
斷言將離開應用程序,斷言來這裏是爲了保護你從編碼器的錯誤。如果一個函數永遠不會收到一個空指針,如果它確實是一個錯誤,那麼一個斷言就是正確的工具。
如果你想表達的exceptionnal情況,而不是例外是你正在尋找
的Debug.Assert的並不意在釋放碼(因此 '調試' :))來結束。選擇中止意味着終止引發斷言的進程。如果您選擇忽略,它應該繼續,並且無論哪種方式,這不應該在發佈版本中發生,因爲Debug.Assert將被刪除。
編輯:這裏有一個鏈接到MSDN解釋:http://msdn.microsoft.com/en-us/library/e63efys0.aspx
感謝您的評論的工具。我仍然很難區分異常可能適合何時以及何時斷言。 – 2011-04-13 07:28:13
@liortal作爲一個經驗法則,我通常爲程序員使用斷言錯誤。把它想成合同。 「如果你使用我的函數,請不要使用空指針」。這樣,如果它發生了,它會很快失敗(這很好),並且在調試期間(這更好)。例外情況通常是針對可能發生的特殊情況。你通常想從異常中恢復,而斷言是編程錯誤,你想盡快修復它們。 – Drahakar 2011-04-13 07:35:06