[英]Why does the debugger hit the default case?
一些同事遇到了一個非常奇怪的調試問題,他單步執行開關,單步執行某些情況,但隨后又遇到了默認情況。 我不知道這怎么會發生!
它很容易重現,我終於將代碼提取到一個小測試中。
如果我只在默認情況下設置斷點,那么調試器將永遠不會停在那里。 但是如果我在case 42處加一個斷點,然后使用step over,它之后會碰到default case!! 請注意,盡管從未達到過捕獲。 所以調試器似乎顯示了一些實際上沒有發生的事情? 另外,如果我刪除異步任務並等待,那么它就不會發生..我們還需要另一個聲明變量的案例(花哨的東西,而不是簡單的整數等。)
public class Foo
{
public readonly string Bar = nameof(Bar);
}
public async Task DoSomething(int x)
{
try
{
switch (x)
{
case 43:
var foo = new Foo();
break;
case 42:
Console.WriteLine(x);
break;
default:
throw new NotImplementedException("aaarghh..");
}
}
catch (Exception exc)
{
MessageBox.Show(exc.Message);
}
}
private async void btnSomethingTo_Click(object sender, EventArgs e)
{
await DoSomething(42);
}
Sinatr 創建的 GIF 用於說明手頭的主題,謝謝!
您沒有以正確的方式使用DoSomething方法。 ASYNC關鍵字意味着您在方法中的某處有一些await調用(以便在任務結束后稍后獲得返回點),但您沒有。 您奇怪的調試器行為與實現有關。 你的異常不是事實拋出的。 我已經復制了您的案例,並且調試器只是忽略/跳過了MyException構造函數,並且從未調用過catch (Exception exc)部分中的代碼。 或者,如果我在CASE 42 中出現中斷:並且我只是按 F5,那么我在 DEFAULT 部分中的斷點將被跳過。
public async Task DoSomething(int x)
{
try
{
switch (x)
{
case 43:
var foo = new Foo();
break;
case 42:
Debug.WriteLine(x);
break;
case 44:
break;
default:
throw new MyException("aaarghh..");
}
}
catch (Exception exc)
{
MessageBox.Show(exc.Message);
}
}
private async void button1_Click(object sender, EventArgs e)
{
await DoSomething(42);
}
public class MyException : Exception
{
public MyException(string message): base(message)
{
if (message != null)
Debug.WriteLine(message);
}
public MyException() : base()
{
}
public MyException(string message, Exception innerException) : base(message, innerException)
{
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.