首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >尝试-捕获每个数据库连接?

问尝试-捕获每个数据库连接?
EN

Stack Overflow用户
提问于 2011-01-13 22:00:32
回答 4查看 32.7K关注 0票数 11

建议在打开数据库连接的每个函数中放置try-catch块并记录错误,还是应该在应用程序的更高层捕获错误?

代码语言:javascript
复制
public static Category GetCategoryByName(string name)
{
    Category result;
    try
    {
        using (IDbConnection conn = ConnectionHelper.CreateDbConnectionByName(_connectionStringName))
        {
            conn.Open();
            using (IDbCommand cmd = conn.CreateCommand())
            {
                //do stuff
            }
        }
    }
    catch(Exception e)
    {
         // log error here?
    }
    return result;
}

或者更确切地说

代码语言:javascript
复制
try
{
    Category myCat = DataTools.GetCategoryByName("myCat");
    // other stuff
}
catch(Exception e)
{
   // log error here?
}

总结一下:是否应该在代码中尽可能早地捕获错误?或者我应该在我有更多关于上下文的信息的情况下捕获它们?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-01-13 22:02:38

像往常一样,这取决于,但通常情况下,只有当你可以对其做些什么,或者你有特定的代码(例如重试)发生时,才能捕获异常,否则,让异常冒泡起来,最顶层可以以集中的方式记录/处理它。

任何其他方式都会导致大量日志记录代码散布在所有业务逻辑中。

票数 17
EN

Stack Overflow用户

发布于 2011-01-13 22:37:19

在捕获异常时,始终尝试使用您可以使用的最准确的异常。例如,在使用SQL Server时,捕获SqlException,因为它包含的异常信息比一般异常多得多。您可以获得实际的行号和其他有用的诊断信息。

在提取并记录了所有相关的内容之后,重新抛出异常或将其包装在不太具体的异常中,如InvalidDataException或exception并抛出该异常。然后,您可以在更高级别捕获这些更通用的异常。

代码语言:javascript
复制
try
{
    // Execute DB call here
}
catch(SqlException exp)
{
    // Log what you need from here.
    throw new InvalidOperationException("Data could not be read", exp);
}

当您从更高的级别调用此方法时,您可以只捕获InvalidOperationException。如果较高级别确实需要更多详细信息,InnerException将提供可访问的SqlException。

我遵循的异常处理的一般方法是只捕获我可以有效操作的内容。在较低级别的代码中捕获真正通用的异常是没有意义的,因为你真的可以预期一切都会出错,或者能够从每个异常中恢复过来,例如OutOfMemoryException或StackOverflowException。

票数 7
EN

Stack Overflow用户

发布于 2011-01-13 22:07:44

我通常只处理UI中的异常,下面的所有东西我总是把它抛回顶层。通过这种方式,堆栈跟踪可以一直保持下去。你可以随时记录并抛出它。

我以前也用过这个:

​

代码语言:javascript
复制
try
{
   DB Command
}
catch (Exception ex)
{
   Log(ex)
   throw; //preserve stacktrace
}

​

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4680845

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档