【问题标题】:Catching Database Exceptions捕获数据库异常
【发布时间】:2013-03-21 22:37:05
【问题描述】:

所以我正在设计一个Web 服务,当然;我需要这个Service 来自动写入一个Database。这很简单;但显然 Sql 有玩不好的倾向。

这在故障排除时几乎是一场噩梦,更不用说通过 Web 服务 会使调试变得更加噩梦。

所以我上网查了一下,偶然发现了一篇关于 Stack Overflow 的文章,其中谈到了一个 SqlHelper 类,它基本上有一个庞大的列表:

public static bool IsDuplicateId(SqlException sex)
{
    return (sex.Number == 2601);
}

这样实现会很乏味,因为您必须调用所有这些方法。但是,有人回答:

switch (e.Number)
    case 2601:
         // Do Something
         break;
    default:
        throw;

所以我想为什么不创建一个 Class 来处理大多数这些可能的错误。考虑到这个特定的实现:

public class SqlExceptionHelper
{
    public SqlExceptionHelper(SqlException sqlException)
    {
        // Do Nothing.
    }

    public static string GetSqlDescription(SqlException sqlException)
    {
        switch (sqlException.Number)
        {
             case 21:
                 return "Fatal Error Occurred: Error Code 21.";
             case 53:
                 return "Error in Establishing a Database Connection: 53.";
             default
                 return ("Unexpected Error: " + sqlException.Message.ToString());
         }
     }
}

所以我的想法是我有一个,可以重复使用它来检测一些常见的错误;在其他类中,我只需 using SomeNamespace.ExceptionHelpers; 我可以实现类似的东西:

public class SiteHandler : ISiteHandler
{
     public string InsertDataToDatabase(Handler siteInfo)
     {
          try
          {
              // Open Database Connection, Run Commands, Some additional Checks.
          }
          catch(SqlException exception)
          {
             SqlExceptionHelper errorCompare = new SqlExceptionHelper(exception);
             return errorCompare.ToString();
          }
     }
}

所以本质上它应该处理所有那些可爱的异常;但我开始想这不好。 返回这样的异常作为回报好吗?这本身会很糟糕吗?或者这真的是通过服务处理此类异常捕获的最佳方式吗?

所以我的问题归结为:

       Is this the best way to handle error catching through a Service?

感谢您的帮助。

【问题讨论】:

  • 如果你的服务返回了一个好的值的字符串和一个异常消息的字符串,你的客户端将有一个噩梦要解决
  • 另外这里已经有像你这样的问题stackoverflow.com/questions/856993/…
  • @Steve 我的 Google 技能似乎很糟糕,因为我没有看到那篇文章。我很抱歉。
  • 有时只需查看此页面右侧的相关列很有用

标签: c# web-services exception


【解决方案1】:

理想情况下,Web 服务应该返回相关的 HTTP 状态代码,而不是异常。这些通常在 200 秒(对于 OK)、400 秒(对于用户可以自己修复的错误)或 500 秒(对于服务器错误 - 这些也可以自动重试)。

根据您返回的数据库错误,您可以将其转换为适当的 HTTP 状态代码。如果您认为对用户有帮助,可以将错误代码的描述设置为异常消息。

【讨论】:

  • 所以本质上我应该将这些异常转换为 HTTP 状态码;不要听起来天真。但是为什么返回 HTTP 错误代码很重要,而不仅仅是一个异常字符串呢?
  • 因为异常是 .NET 特定的概念。互联网包含的语言要多得多,其中很多语言不理解异常。
  • 这真的很有意义,谢谢你的解释。
  • 另外,话虽如此,微软确实试图通过使用 SOAP 错误或服务错误(我忘记了确切的名称)来更容易地向客户端返回异常(如果客户端是 .NET 客户端) )。但是,这些将返回 500(或类似)的 HTTP 状态代码,并让客户端从有效负载中解开错误描述。如果您使用的是非 .NET 客户端,这将无法正常工作。
  • 是的,都是.Net。但我就像“我觉得我做错了什么。”
猜你喜欢
  • 2011-02-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多