簡體   English   中英

Visual Studio:編輯並繼續處理已處理的異常?

[英]Visual Studio: edit-and-continue on handled exceptions?

這是一個代碼,再現了我期望得到的行為:

    static void Main(string[] args)
    {
        // try // #2
        {
            string x = null; // #1
            AssertNotNull(x, nameof(x));
        }
        // catch (ArgumentNullException) { } // #2
        Console.WriteLine("Passed.");
        Console.ReadKey();
    }

    [DebuggerHidden]
    public static void AssertNotNull<T>(T arg, string argName) where T : class
    {
        if (arg == null)
            throw new ArgumentNullException(argName);
    }

對於從VS2008開始的任何VS,其行為都是相同的(未在較早版本上進行檢查)。

如果在調試下(使用標准調試設置)運行它,則在修復代碼(使用EnC)之前,不允許繼續運行。 由於[DebuggerHidden]和“在未處理的異常上展開堆棧”設置組合(默認情況下啟用了該設置),因此按F5只會重新運行斷言。

要修復代碼,只需將#1行替換為object x = "" ,為其設置下一條語句,然后再次按F5。

現在,為ArgumentNullException啟用“拋出時中斷”,並取消標記為#2的行的注釋。 行為發生了變化:您再次在斷言時停止,但是堆棧不會展開(可通過CallStack窗口輕松檢查)。 F5將從引發異常的地方繼續。

好的,所以...現在的問題是:在打破處理的異常時,有什么方法可以啟用自動堆棧展開功能嗎?

隱藏的VS選項,現有擴展或可以從我自己的擴展中使用的(也許)API?

UPD:要澄清一個問題:我想斷言失敗的行,用edit編輯代碼,然后繼續,將next語句設置為固定代碼,然后繼續執行。

如果異常未在堆棧中捕獲,則可以正常工作。

UPD2由Hans Passant提出: 在UserVoice上發布了一條建議 隨意投票:)

並取消注釋標記為#2的行

這是您問題的關鍵部分。 您所做的改變不止一件事,關鍵的改變是您改變了堆棧的展開方式。 您喜歡的調試器選項的標題為“ 在未處理的異常上展開堆棧”。 問題是,不再有未處理的異常。 您的catch子句處理它,現在是CLR展開堆棧。

並且必須由CLR進行平倉,調試器沒有選項可以在您要求的第一次機會異常中斷時執行。 而且SetNext在那時無法正常工作。 如果我正確地解釋了這個問題,那么您真的很想擁有,因為接下來您需要做的是忙碌的工作,單步執行catch塊並不會帶來很大的樂趣。

盡管尚未實施,但我認為它在技術上是可行的。 但這僅僅是因為我非常高興地不知道調試器團隊將要做多少工作。 使E + C更好地工作是一個很好的要求,您可以在此處提出 將URL發布到您的提案中作為一個好主意,很可能會贏得很多選票。 我會投票。

為了澄清這個問題:我想斷言失敗的行,用edit編輯代碼,然后繼續,將next語句設置為固定代碼,然后繼續執行。

  1. 打開“例外設置”菜單(“調試”>“ Windows”>“例外設置”)
  2. 在“公共語言運行時異常”下,選中“ System.ArgumentNullException”框。 (或者全部檢查,無論您要尋找什么。)

現在,無論何時拋出System.ArgumentNullException ,它都應該中斷,無論是否將其捕獲在catch塊中。

但是, 您不能編輯和繼續活動語句 如果您嘗試修改斷言行,則會看到類似以下內容的內容:

在此處輸入圖片說明

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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