如何正确处理泛型类中的错误?

时间:2012-01-13 22:10:21

标签: c# error-handling

我正在研究泛型类,正在处理错误。我在一个地方使用try catch我收到错误。问题是,如何将该错误返回给调用方法?

    public static DataTable GetData(string connString, string sqlStatement, Action<iDB2ParameterCollection> parameters)
    {
        DataTable dt = new DataTable();

        using (iDB2Connection conn = new iDB2Connection(connString))
        {
            using (iDB2Command cmd = new iDB2Command(sqlStatement, conn))
            {
                conn.Open();
                if (parameters != null) { parameters(cmd.Parameters); }
                try
                {
                    using (iDB2DataAdapter da = new iDB2DataAdapter(cmd)) { da.Fill(dt); }
                }
                catch (iDB2SQLErrorException e)
                {
                }

                conn.Close();
            }
        }

        return dt;
    }

4 个答案:

答案 0 :(得分:5)

不要在基类中捕捉它!

我不喜欢捕获和吞噬基类级别的异常。

让派生类担心这些细节。

旁注(职位证据): 您会注意到,在几乎任何API中,doucmentation将报告将使用类引发的异常。如果他们要在基类中捕获它们,那么它们已经有效地吞噬了它们,使得你们无法像上述类的用户那样无助。

其他文章:

  

...而不是根据细节编写我们的抽象,我们应该   根据抽象来写详细信息。

这是依赖倒置原则的核心租户。

请看一下这篇文章,了解设计过程中需要考虑的一些非常好的事情,http://www.oodesign.com/design-principles.html

答案 1 :(得分:1)

我们这样做,出于同样的原因,你似乎正在这样做。这样您就可以确保连接已关闭。

我们只是重新抛出相同的错误并在“finally”块中丢失连接。这样可以关闭连接并仍然将连接冒泡回调用者,因为无论如何都会执行“finally”块。

catch (iDB2SQLErrorException e) 
{ 
   throw e;
} 
finally
{
   cn.Close();
}

以上代码是我们多年来使用的代码,但由于这些评论,我认为可能需要调整。有关如何使用异常处理保留堆栈跟踪的信息,请参阅此博客文章:http://weblogs.asp.net/fmarguerie/archive/2008/01/02/rethrowing-exceptions-and-preserving-the-full-call-stack-trace.aspx

答案 2 :(得分:0)

  1. 您可以在此方法内部实现一些处理异常的逻辑,然后重新抛出它。异常将在调用堆栈中冒出来;
  2. 其他选项是使用错误代码在堆栈中传递错误。这取决于API。

答案 3 :(得分:0)

要么不抓住它并让调用者处理它,要么抛出包含原始错误的错误:

class DataRetrievalException : Exception {
    DataRetrievalException(String message, Exception cause) : base(message, cause) {}
}

// ...
catch (iDB2SQLErrorException e) {
    throw new DataRetrievalException("Error retrieving data from database", e);
}