【问题标题】:How can I categorize Exception errors?如何对异常错误进行分类?
【发布时间】:2012-06-13 16:58:48
【问题描述】:

我有这个以消费者为目标的应用程序,它内置了错误报告。 有时我会收到关于 the remote name could not be resolved 等异常的错误报告 例如,在 google.com 等主机名上。 这显然不是我的应用程序的问题,而是用户端的问题。

如何在我的应用程序中对某些异常进行分类,而不是提供发送错误报告,而是显示一个对话框,建议用户检查他/她的某些事​​情。 还要考虑到用户已本地化 .NET 框架安装这一事实。 (以他们的语言显示的错误消息)

编辑:这真的不是关于将SQLExceptionWebException 分开的问题,更重要的是我如何从WebException The operation has timed-out 中确定remote name could not be resolved 类型的WebException。

【问题讨论】:

    标签: c# exception globalization


    【解决方案1】:

    在 WebException 的情况下,您可以确定错误是 HTTP 错误(即:404)还是不使用“状态”属性。

    catch (WebException ex)
    {
        if (ex.Status != WebExceptionStatus.ProtocolError)
           // in this case it was probably a connection issue
    }
    

    您可以在 WebExceptionStatus 枚举 here 上找到更多详细信息。

    【讨论】:

      【解决方案2】:

      【讨论】:

        【解决方案3】:

        您想使用带有多个 catch 块的 try/catch 语句:

        try { ... connect... }
        catch(SocketException ex) { 
          switch(ex.ErrorCode)
          {
            case 123: ....
            default: ....
          }
        }
        catch(WebException ex) { 
          if(ex.InnerException is SocketException)
          {
            switch(((SocketException)ex.InnerException).ErrorCode)
            {
              case 123: ....
              default: ....
            }
          }
          switch(ex.Status)
          {
            case 500: ....
            default: ....
          }
        }
        ....
        catch(Exception ex) { .... something unforeseen, send error report .... }
        

        基本上,这些异常中的每一个都应该在属性中包含其他信息,您可以在不依赖字符串比较的情况下检查这些信息。

        【讨论】:

          【解决方案4】:

          尽可能按类型捕获异常(和内部异常,如果需要) 或者 如果没有足够具体地键入,请另外检查消息或任何其他异常详细信息(错误代码/编号/等) 然后 通过触发正确的面向用户的对话框来适当地处理这种情况。

          函数的一些伪代码:

          public UserError DoStuff()
          {
           try
           {
            // some web code
            // some sql code
           }
           catch (WebException webEx)
           {
             if (webEx.Message.Contains("SSL"))
             {
               return new UserError { Type = ErrorType.SSL };
             }
          
             return new UserError { Type = ErrorType.Web };
           }
           catch (SqlException sqlEx)
           {
              return new UserError { Type = ErrorType.SQL };
           }
          }
          

          【讨论】:

          • 嘿,Magnus,我认为解析消息本身仍然可以让您在任何异常类型上获得这种能力(包含方法调用),但根据异常类型,您还可以访问基于数字的异常代码。 SQL 和 Web 都有它们,正如其他人在上面详述的那样。
          猜你喜欢
          • 1970-01-01
          • 2013-07-30
          • 1970-01-01
          • 2016-03-04
          • 1970-01-01
          • 2020-05-25
          • 2015-06-05
          • 2018-07-28
          • 2020-03-09
          相关资源
          最近更新 更多