Какое исключение следует выдать, если запрос ADO.NET не может получить запрошенные данные? - PullRequest
2 голосов
/ 23 сентября 2008

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

У меня такой вопрос: при создании исключений в ADO.NET, если определенный запрос не возвращает данных или данные не могут быть найдены, какой тип исключения следует использовать?

Psuedocode: (читай, не изучай семантику кода, я знаю, что он не скомпилируется)

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 ]

7 голосов
/ 23 сентября 2008

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

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

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

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

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

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

2 голосов
/ 23 сентября 2008

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

2 голосов
/ 23 сентября 2008

Что касается 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");
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...