【问题标题】:How to handle the different type of exceptions from the same Exception Object?如何处理来自同一个异常对象的不同类型的异常?
【发布时间】:2018-10-01 22:09:50
【问题描述】:

例如,Socket Exceptions 可以返回与超时相关的消息或“主动拒绝”消息,这通常是由用于其他用途的关闭端口/端口引起的。

我将如何根据它正确地做一个 switch 案例?
我可以做一个ex.Message.Contains(),但如果它在非英语系统上运行,消息将不是英语,所以.Contains() 将不匹配。
是否有某种我可以检查的签名或某种全局且不会更改的异常代码?

【问题讨论】:

  • .InnerException 属性是否不同?
  • 您真的需要处理这些不同的情况吗?只需向用户返回他必须重试并发送消息。超时和拒绝很清楚,除了重试几次之外,我看不到您可以通过编程方式做什么,然后无论如何您仍然必须将其扔给用户选择退出或继续重试。

标签: c# .net exception


【解决方案1】:

如果你正确使用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 以找到您想要控制的任何情况。

【讨论】:

  • 非常感谢没有发现这个!
【解决方案2】:

专门针对 Socket Exceptions,您可以通过 SocketException.ErrorCode 属性获取套接字错误代码,然后将其打开。我喜欢使用here发布的枚举

但从更广泛的意义上说,我认为你看错了。没有“通用”或“通用”的方式来处理自定义字段的异常。从继承的角度来看,唯一可以依赖的字段是从Exception 继承的字段。如果您正在处理一个继承自 Exception 的类,那么您应该为该异常专门编写代码。

请记住,您始终可以使用异常的类型进行条件处理:

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

【讨论】:

    【解决方案3】:

    您可以将 Socket 异常与任何其他异常分开,如下所示:

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

    另外您可以检查 HResult 属性,看看您是否可以获得不同的值,具体取决于您遇到的错误类型。

    【讨论】:

      猜你喜欢
      • 2015-09-20
      • 1970-01-01
      • 2021-04-27
      • 2015-06-12
      • 1970-01-01
      • 2013-06-03
      • 1970-01-01
      • 2014-01-30
      • 1970-01-01
      相关资源
      最近更新 更多