Какое исключение должно генерироваться, если запрос 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;
}
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
0
4 945
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

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

Наследуйте ApplicationException, рекомендованный Microsoft класс для создания настраиваемых исключений.

icelava 24.09.2008 10:34

Не более того: «Вы должны выводить настраиваемые исключения из класса Exception, а не из класса ApplicationException. Вы не должны генерировать исключение ApplicationException в своем коде, и вы не должны перехватывать исключение ApplicationException, если вы не собираетесь повторно генерировать исходное исключение. " -msdn.microsoft.com/en-us/library/…

Joel McBeth 15.09.2014 18:51

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

Ответ принят как подходящий

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

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

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

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

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

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

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