如何捕获ExtendedSocketException?

时间:2019-07-05 22:06:21

标签: c# sockets exception .net-core

这听起来可能很愚蠢,但是我无法捕捉到ExtendedSocketException抛出的SocketTaskExtensions.ConnectAsync()

完整的名称空间是:System.Net.Internals.SocketExceptionFactory.ExtendedSocketException

编译器抱怨Cannot resolve symbol 'ExtendedSocketException'。我的班级库和测试项目都针对.Net Core 2.1。

也没有可以添加的参考或Nuget包。至少我找不到任何东西... https://docs.microsoft.com上似乎也什么也没有...

我在这里做什么错了?

[Fact]
[Trait("Category", "UnitTest")]
public async Task Should_Throw_Exception_If_Port_Unreachable()
{
    // Arrange
    var client = new TcpConnector();
    var nonListeningPort = 81;
    var endpoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), nonListeningPort);

    // Act & Assert
    var connectTask = client.ConnectAsync(endpoint);
    Func<Task> func = async () => { await connectTask; };

    func.Should().Throw<ExtendedSocketException>();
}

3 个答案:

答案 0 :(得分:0)

ExtendedSocketExceptionprivate类,因此您不能在.NET内部框架之外引用它。但是,您可以捕获SocketException并检查异常消息。

答案 1 :(得分:0)

即使ExtendedSocketException是私有的,也肯定会被公开: ExtendedSocketException

另一方面,它是从SocketException继承的,因此我们不必太在意它。

就您的测试而言,我认为您应该能够将断言修改为类似于以下内容的内容:

var exception = Assert.Catch(func);
Assert.IsInstanceOf<SocketException>(exception);
Assert.That(exception.Message.Contains("actively refused"));

答案 2 :(得分:0)

Error: at Source 'AvengersHeader': Missing column 'URL源自ExtendedSocketException(对于.NET Core)。仍然可以通过使用catch SocketException的catch块来处理。我们可以通过SocketException进行确认:

System.Type.IsAssignableFrom(Type c)

在xUnit中,断言可以是:

catch (Exception e)
{
     Debug.Write(typeof(SocketException).IsAssignableFrom(e.GetType()));
}