c# - Try-Catch 中未捕获异步任务异常
问题描述
我正在尝试Socket.ReceiveAsync()
通过调用Socket.Close()
和处理不可避免的来取消通话SocketException
。
我的问题是异常似乎永远不会出现try/catch
在调用函数中。像这样:
public async Task DoSomethingAsync()
{
Try
{
while(true)
{
await DoSomethingMoreSpecificAsync();
....
}
}
catch(Exception ex)
{
do some logging... <-- exception never makes it here
}
finally
{
cleanup stuff(); <-- or here...
}
}
public async Task DoSomethingMoreSpecificAsync()
{
var read = await _sock.ReceiveAsync(...); <-- Exception is thrown here
}
因此,当抛出异常时,应用程序永远不会进入catch
orfinally
块。它只是抱怨一个未处理的异常。AFAIKasync Task
方法应该像任何其他方法一样向上传播它们的异常。我知道如果我使用这将是正常的async void
...
在控制台中,应用程序崩溃后,我看到:
在抛出“PAL_SEHException”实例后调用终止
这是实际的代码:
private async Task DoReceiveAsync()
{
var writer = _inputPipe.Writer;
Exception ex = null;
try
{
while (true)
{
var mem = writer.GetMemory(TLS_MAX_RECORD_SIZE);
MemoryMarshal.TryGetArray(mem, out ArraySegment<byte> buf);
//Since OpenSSL will only gve us a complete record, we need a func that will piece one back together from the stream
await ReadRecord(mem);
var res = _ssl.Read(buf.Array, TLS_MAX_RECORD_SIZE);
writer.Advance(res);
var flush = await writer.FlushAsync();
if (flush.IsCanceled || flush.IsCompleted)
break;
}
}
catch (Exception e) { ex = e; }
finally { writer.Complete(ex); }
}
private async Task ReadRecord(Memory<byte> mem)
{
MemoryMarshal.TryGetArray(mem, out ArraySegment<byte> buf);
SslError res;
do
{
var sockRead = await _socket.ReceiveAsync(buf, SocketFlags.None);
if (sockRead == 0) break;
_ssl.ReadBio.Write(buf.Array, sockRead);
var sslRead = _ssl.Peek(peekBuf, TLS_MAX_RECORD_SIZE);
res = _ssl.GetError(sslRead);
} while (res != SslError.SSL_ERROR_NONE);
return;
}
解决方案
推荐阅读
- python - 无论我如何指定它,我的 Selenium Webdriver 都找不到按钮
- arrays - 如何在arduino中存储和调用多个字母?
- php - PHP curl_multi_exec apache限制?
- node.js - Express 应用程序在 Azure 上成功部署,但仍然没有任何效果
- php - 如何为 JQuery 和 Codeigniter 4 启用或允许 Access-Control-Allow-Origin
- php - Plesk Laravel 调度程序不运行
- javascript - 服务器返回http 500错误时如何使用chrome扩展名自动重新加载页面
- php - 在 codeigniter 中从 Legacy stripe checkout 迁移到新版本
- xml - 使用 PowerShell 解析 XML 文件
- go - Go中未定义的函数位于本地包中