当ADO.NET查询无法检索请求的数据时,应该抛出什么异常?

时间:2008-09-23 15:23:30

标签: .net sql exception ado.net

为了向我们的应用程序添加一些参数验证和正确的使用语义,我们尝试为.NET应用程序添加正确的异常处理。

我的问题是:如果特定查询没有返回任何数据或者找不到数据,在ADO.NET中抛出异常时,我应该使用什么类型的异常?

伪码: (阅读,不要仔细检查代码的语义,我知道它不会编译)

public DataSet GetData(int identifier)
{
    dataAdapter.Command.Text = "Select * from table1 Where ident = " + identifier.toString();
    DataSet ds = dataAdapter.Fill(ds);
    if (ds.table1.Rows.Count == 0)
        throw new Exception("Data not found");

    return ds;
}

3 个答案:

答案 0 :(得分:7)

MSDN guidelines州:

  • 考虑抛出驻留在系统命名空间中的现有异常,而不是创建自定义异常类型。

  • 如果您的错误条件可以通过与任何其他现有异常不同的方式以编程方式处理,请创建并抛出自定义异常。否则,抛出一个现有的例外。

  • 不要为了让你的团队例外而创建和抛出新的例外。

没有严格的规则:但如果您有不同方式处理此异常,请考虑创建自定义异常类型,例如DataNotFoundException as suggested by Johan Buret

否则,您可能会考虑抛出一个现有的异常类型,例如System.Data.DataException,甚至可能抛出System.Collections.Generic.KeyNotFoundException。

答案 1 :(得分:2)

就ADO.net而言,返回零行的查询不是错误。如果您的应用程序希望将此类查询视为错误,则应通过继承Exception来创建自己的异常类。

public class myException : Exception
{
   public myException(string s) : base() 
   {
      this.MyReasonMessage = s;
   }
}

public void GetData(int identifier)
{
    dataAdapter.Command.Text = "Select * from table1 Where ident = " + identifier.toString();
    DataSet ds = dataAdapter.Fill(ds);
    if (ds.table1.Rows.Count == 0)
        throw new myException("Data not found");
}

答案 2 :(得分:2)

你真的应该定义自己的异常:DataNotFoundException。

您不应该使用基本类Exception,因为当您在调用代码时捕获它时,您将编写类似

的内容
try
{
     int i;
     GetData(i);

}
catch(Exception e) //will catch many many exceptions
{
    //Handle gracefully the "Data not Found" case;
    //Whatever else happens will get caught and ignored
}

只捕获DataNotFoundEXception只会获得您真正想要处理的情况。

try
{
     int i;
     GetData(i);

}
catch(DataNotFoundException e) 
{
    //Handle gracefully the "Data not Found" case;
} //Any other exception will bubble up

有一个名为SqlException的类,当SQL引擎出现问题时,最好不要用业务逻辑重载它