如何处理来自同一个异常对象的不同类型的异常?

时间:2018-10-01 22:09:51

标签: c# .net exception

例如,套接字异常可以返回与超时有关的消息或“活动被拒绝”消息,这通常是由用于其他用途的封闭端口引起的。

如何基于此适当设置开关盒?
我可以做一个ex.Message.Contains(),但如果它在非英语系统上运行,则该消息将不是英语,因此.Contains()将不匹配。
是否可以检查某种签名,还是可以更改的全局不变的异常代码?

3 个答案:

答案 0 :(得分:3)

如果您正确使用try-catch,即:

try
{
    ...
}
catch (SocketException ex) // this should have an s at the beginning...
{

}

您可以使用Visual Studio功能来获取此信息(编写switch (ex.SocketErrorCode)并按 tab ):

switch (ex.SocketErrorCode)
{
    case SocketError.AccessDenied:
        break;
    case SocketError.AddressAlreadyInUse:
        break;
    case SocketError.AddressFamilyNotSupported:
        break;
    case SocketError.AddressNotAvailable:
        break;
    case SocketError.AlreadyInProgress:
        break;
    case SocketError.ConnectionAborted:
        break;
    case SocketError.ConnectionRefused:
        break;
    case SocketError.ConnectionReset:
        break;
    // some dozens more
    default:
        break;
}

您可以看到the docs来查找要控制的任何情况。

答案 1 :(得分:0)

专门针对套接字异常,您可以通过SocketException.ErrorCode属性获取套接字错误代码,然后打开它。我喜欢使用发布于here

的枚举

但是从广义上讲,我认为您看错了。没有使用自定义字段处理异常的“通用”或“通用”方式。从继承的角度来看它,您唯一可以依靠的字段就是从Exception继承的字段。如果您要处理从Exception继承的类,则应为该异常专门进行编码。

请记住,您始终可以将 type 异常用于条件处理:

try
{
...
}
catch(SocketException sockex)
{
...
}
catch(Exception ex)
{
...
}

答案 2 :(得分:0)

您可以将Socket Exception与其他任何异常分开,例如:

try
{
    // Your socket based code
}
catch (SocketException e) 
{
    // Handle Socket Exception
}
catch (Exception e) 
{
    // Handle Any other exception
}

,您可以检查 HResult属性,以查看是否可以根据所得到的错误类型来获得不同的值。