如何对异常错误进行分类?

时间:2012-06-13 16:58:49

标签: c# exception globalization

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

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

编辑:这不是关于将SQLExceptionWebException分开的问题,更多的是如何从WebException remote name could not be resolved确定类型为The operation has timed-out的WebException。< / p>

4 个答案:

答案 0 :(得分:2)

对于WebException,您可以确定错误是HTTP错误(即:404)还是不使用“Status”属性。

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

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

答案 1 :(得分:1)

答案 2 :(得分:0)

您希望将try / catch语句与多个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 .... }

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

答案 3 :(得分:0)

尽可能按类型捕获异常(如果需要,则为innerexception) 要么 如果没有足够的特异性输入,另外检查消息或任何其他异常详细信息(错误代码/数字/等) 然后 通过触发正确的面向用户的对话框来适当处理这种情况。

函数的一些伪代码:

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 };
 }
}