現在我知道這是擺在首位使用Marshal.GetExceptionCode()
一劈,但問題是不是它(Visual Studio調試器也檢測到活動除外)異常活躍之後已陷入異步方法
private static async Task TestAsync()
{
Log("TestAsync.Before");
await HandleExceptionAsync();
Log("TestAsync.After");
}
private static async Task HandleExceptionAsync()
{
try
{
Log("HandleExceptionAsync.Try");
await ThrowAsync();
}
catch (InvalidOperationException)
{
Log("HandleExceptionAsync.Catch");
}
Log("HandleExceptionAsync.AfterCatch");
}
private static async Task ThrowAsync()
{
await Task.Delay(1000);
throw new InvalidOperationException("Delayed exception");
}
private static void Log(string step)
{
Console.WriteLine($"{step}: {Marshal.GetExceptionCode()}");
}
輸出
TestAsync.Before: 0
HandleExceptionAsync.Try: 0
Exception thrown: 'System.InvalidOperationException' in Interactive.dll
Exception thrown: 'System.InvalidOperationException' in System.Private.CoreLib.ni.dll
HandleExceptionAsync.Catch: -532462766
HandleExceptionAsync.AfterCatch: -532462766
TestAsync.After: -532462766
The thread 9292 has exited with code 0 (0x0).
例外保持活躍整個等待,即使它被抓住鏈。 我檢查生成的代碼,並沒有給出線索,爲什麼發生這種情況,相關的部分(HandleExceptionAsync
狀態機產生MoveNext
):
void IAsyncStateMachine.MoveNext()
{
int num1 = this.\u003C\u003E1__state;
try
{
if (num1 == 0)
;
try
{
TaskAwaiter awaiter;
int num2;
if (num1 != 0)
{
Program.Log("HandleExceptionAsync.Try");
awaiter = Program.ThrowAsync().GetAwaiter();
if (!awaiter.IsCompleted)
{
this.\u003C\u003E1__state = num2 = 0;
this.\u003C\u003Eu__1 = awaiter;
Program.\u003CHandleExceptionAsync\u003Ed__1 stateMachine = this;
this.\u003C\u003Et__builder.AwaitUnsafeOnCompleted<TaskAwaiter, Program.\u003CHandleExceptionAsync\u003Ed__1>(ref awaiter, ref stateMachine);
return;
}
}
else
{
awaiter = this.\u003C\u003Eu__1;
this.\u003C\u003Eu__1 = new TaskAwaiter();
this.\u003C\u003E1__state = num2 = -1;
}
awaiter.GetResult();
awaiter = new TaskAwaiter();
}
catch (InvalidOperationException ex)
{
Program.Log("HandleExceptionAsync.Catch");
}
Program.Log("HandleExceptionAsync.AfterCatch");
}
catch (Exception ex)
{
this.\u003C\u003E1__state = -2;
this.\u003C\u003Et__builder.SetException(ex);
return;
}
this.\u003C\u003E1__state = -2;
this.\u003C\u003Et__builder.SetResult();
}
我沒有看到這個被相關的同步上下文無論是(在這種情況下,它是一個控制檯應用程序,所以延期計劃在游泳池),我最好的猜測是有一些調用堆棧操作發生,但我找不到任何有關這方面的好消息。
我會很感激,如果有人可以解釋爲什麼發生這種情況,並解釋文檔如何在CLR實現提供鏈接/編譯器
UPD1:該VS調試器的新增截圖表示主動例外異步,示出了同步沒什麼
'GetExceptionCode'在結構化異常處理程序的過濾器之外有[未定義的行爲](https://msdn.microsoft.com/en-us/library/windows/desktop/ms679356(v = vs.85)。 ASPX)。如果您遇到在被捕獲後導致「活動」異常的場景,請發佈問題的重播。 –
@StephenCleary這個特殊的代碼顯示異常在VS調試器($ exception變量)中處於活動狀態。這不適合你嗎? –
對我而言,「主動」意味着它被拋出(或 - 在擴展使用中 - 已被捕獲)。你是否看到過這樣的行爲,還是僅僅是'$ exception'調試器變量? –