Какое исключение следует создать, если запрос ADO.NET не может получить запрошенные данные?

StackOverflow https://stackoverflow.com/questions/121700

  •  02-07-2019
  •  | 
  •  

Вопрос

Пытаясь добавить в наше приложение некоторую проверку параметров и правильную семантику использования, мы пытаемся добавить правильную обработку исключений в наши .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;
}
Это было полезно?

Решение

А Рекомендации MSDN состояние:

  • Рассмотрите возможность создания существующих исключений, находящихся в пространствах имен системы, вместо создания пользовательских типов исключений.

  • Создавайте и вызывайте собственные исключения, если у вас есть состояние ошибки, которое можно программно обработать иначе, чем любые другие существующие исключения.В противном случае выдайте одно из существующих исключений.

  • Не создавайте и не выдавайте новые исключения только для того, чтобы это было исключение для вашей команды.

Не существует жесткого правила:но если у вас есть сценарий обработки этого исключения по-другому, рассмотрите возможность создания собственного типа исключения, например DataNotFoundException. как предложил Йохан Бурет.

В противном случае вы можете рассмотреть возможность создания одного из существующих типов исключений, например System.Data.DataException или, возможно, даже System.Collections.Generic.KeyNotFoundException.

Другие советы

Что касается 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");
}

Вам действительно следует определить свое собственное исключение: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, но лучше не перегружать его своей бизнес-логикой.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top