[英]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語句設置為固定代碼,然后繼續執行。
現在,無論何時拋出System.ArgumentNullException
,它都應該中斷,無論是否將其捕獲在catch
塊中。
但是, 您不能編輯和繼續活動語句 。 如果您嘗試修改斷言行,則會看到類似以下內容的內容:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.