我正在研究泛型类,正在处理错误。我在一个地方使用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;
}
答案 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)
答案 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);
}