4

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

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

编辑:这真的不是关于SQLException从中分离的问题WebException,更多的是我如何从 WebException 确定类型remote name could not be resolved的 WebExceptionThe operation has timed-out例如。

4

4 回答 4

2

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

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

您可以在此处找到有关 WebExceptionStatus 枚举的更多详细信息。

于 2012-06-13T20:00:01.757 回答
1

我强烈建议您查看Enterprise Library Exception Handling Application Block

于 2012-06-13T17:46:02.783 回答
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 .... }

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

于 2012-06-13T17:04:29.737 回答
0

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

函数的一些伪代码:

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 };
 }
}
于 2012-06-13T17:06:09.450 回答