2

为了向我们的应用程序添加一些参数验证和正确的使用语义,我们正在尝试向我们的 .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;
}
4

3 回答 3

8

MSDN 指南指出:

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

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

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

没有硬性规定:但如果您有一个以不同方式处理此异常的方案,请考虑创建自定义异常类型,例如Johan Buret 建议的DataNotFoundException 。

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

于 2008-09-23T16:09:23.960 回答
3

你真的应该定义你自己的异常: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 引擎出现问题时,最好不要让您的业务逻辑超载它

于 2008-09-23T15:38:33.877 回答
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");
}
于 2008-09-23T15:29:05.743 回答