C# 捕获数据库异常

C# 捕获数据库异常,c#,web-services,exception,C#,Web Services,Exception,因此,我正在设计一个Web服务,当然;我需要这个服务自动写入数据库。这是非常直截了当的;但很明显,Sql有一种不好用的倾向 这在排除故障时几乎是一场噩梦,更不用说通过Web服务进行故障排除会使调试变得更像一场噩梦 因此,我查看了互联网,偶然发现了一篇关于堆栈溢出的文章,其中谈到了一个SqlHelper类,该类基本上有大量以下内容: public static bool IsDuplicateId(SqlException sex) { return (sex.Number == 2601

因此,我正在设计一个Web服务,当然;我需要这个服务自动写入数据库。这是非常直截了当的;但很明显,Sql有一种不好用的倾向

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

因此,我查看了互联网,偶然发现了一篇关于堆栈溢出的文章,其中谈到了一个SqlHelper类,该类基本上有大量以下内容:

public static bool IsDuplicateId(SqlException sex)
{
    return (sex.Number == 2601);
}
因此,实现将是乏味的,因为您必须调用所有这些方法。然而,有人回答说:

switch (e.Number)
    case 2601:
         // Do Something
         break;
    default:
        throw;
所以我想为什么不创建一个类来处理大多数可能的错误呢。考虑到这一具体实施:

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());
         }
     }
}
所以我的想法是,我有一个类,可以重用它来检测一些常见的错误;在其他类中,我只是使用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();
          }
     }
}
所以本质上它应该处理所有这些可爱的例外;但我开始想这不好将此类异常作为返回是否良好?这本身就不好吗?或者这真的是通过服务处理此类异常捕获的最佳方法吗?

因此,我的问题归结为:


感谢您的帮助。

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


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

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



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

如果您的服务返回一个字符串作为良好值,并返回一个字符串作为异常消息,则您的客户将面临一场噩梦需要解决。此外,这里已经有一个类似您的问题@Steve My Google skills似乎很糟糕,因为我没有看到那篇文章。我很抱歉。有时候,只需查看本页右侧的相关列是很有用的。如果您的服务返回一个字符串作为良好值,返回一个字符串作为异常消息,您的客户将有一个噩梦需要解决。这里已经有一个像您这样的问题@Steve My Google skills看起来很糟糕,因为我没有看到那篇文章。很抱歉,有时候只看一下本页右侧的相关列是很有用的,所以本质上我应该将这些异常转换为HTTP状态码;听起来并不幼稚。但是为什么返回HTTP错误代码而不仅仅是异常字符串很重要呢?因为异常是一个特定于.NET的概念。互联网包含了更多的语言,其中许多语言不理解异常。这实际上是非常有意义的,谢谢你的解释。而且,说到这里,微软确实试图通过使用SOAP错误或服务错误(我忘记了确切的名称)来更容易地将异常返回给客户端(如果客户端是.NET客户端)。但是,它们将返回HTTP状态代码500(或类似值),并让客户端从有效负载中展开错误描述。如果您使用的是非.NET客户机,这将无法正常工作。是的,它将全部使用.NET。但我就像是“我觉得我做错了什么”,所以本质上我应该把这些异常转换成HTTP状态码;听起来并不幼稚。但是为什么返回HTTP错误代码而不仅仅是异常字符串很重要呢?因为异常是一个特定于.NET的概念。互联网包含了更多的语言,其中许多语言不理解异常。这实际上是非常有意义的,谢谢你的解释。而且,说到这里,微软确实试图通过使用SOAP错误或服务错误(我忘记了确切的名称)来更容易地将异常返回给客户端(如果客户端是.NET客户端)。但是,它们将返回HTTP状态代码500(或类似值),并让客户端从有效负载中展开错误描述。如果您使用的是非.NET客户机,这将无法正常工作。是的,它将全部使用.NET。但我只是想“我觉得我做错了什么。”
       Is this the best way to handle error catching through a Service?