首页 > 解决方案 > 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
}

因此,当抛出异常时,应用程序永远不会进入catchorfinally块。它只是抱怨一个未处理的异常。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;
}

标签: c#exceptiontry-catch

解决方案


推荐阅读