[英]Library eats up my exceptions
我正在使用這樣的GUI庫(偽代碼):
static void ProcessFrame()
{
// ...
if(fooWentWrong) throw new FooException();
if(barWentWrong) throw new BarException();
// ...
}
static void Main()
{
GUILib.OnEveryFrame += delegate { ProcessFrame(); };
try
{
GUILib.MainLoop();
}
catch(FooException e) // we don't handle BarException
{
// handle exception.
}
}
換句話說,GUILib正在使用控制反轉-它的主循環調用我的委托。
問題在於GUILib是一個舊版庫,可捕獲OnEveryFrame處理程序引發的任何異常並將其僅打印到控制台,因此FooExceptions不會到達我的FooException處理程序,而對於BarExceptions,Visual Studio調試器不會中斷。
我通過轉到Debug- > Exceptions並檢查“ Common Language Runtime exceptions” 引發的中斷 (而不僅僅是“ on onhandled中斷”)框來使BarExceptions調試器中斷。 這行得通,但是這意味着VS現在會在拋出任何異常時中斷,即使處理程序會捕獲到它也是如此。 所以我不能對非致命的東西使用例外。
還有什么更好的方法可以使VS打破我的例外? 我需要以某種方式解決圖書館的損壞行為。
順便說一句,該庫是qt4dotnet / Qt Jambi。
您應該檢查GUILib是否具有“未處理的”異常事件。
另一種方法是自己觸發調試器:
System.Diagnostics.Debugger.Break();
代替或除了引發Exception外。
根據您感興趣的異常,使用Debug-> Exceptions對話框可能會走上正確的路,只是您勾選了所有 CLR異常,因此它捕獲了所有內容。
您可以對其進行更好的過濾:單擊CLR例外條目旁邊的[+]圖標以展開它,然后將其全部列出,然后您可以勾選特定的-或相反,然后勾選主要一個可以在調試器中捕獲所有異常,然后取消選中一些特定的異常(例如MyInternalNotReallyAnExceptionButJustAStatusCodeException * :-)。 要輕松查找一個或兩個特定的異常,請單擊“查找...”並鍵入部分名稱-例如,“ NullR”將找到NullReferenceException。
*(是的,我不喜歡使用異常來報告狀態信息的想法-IMHO異常應主要用於傳遞無法在拋出站點處理的故障)
是否可以將異常處理移入委托中? 它可能最終會帶有一些冗余代碼,但是您應該能夠將異常處理主體重構為一個函數。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.