簡體   English   中英

圖書館吞噬了我的例外

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM