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





Что касается 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");
}
Не более того: «Вы должны выводить настраиваемые исключения из класса Exception, а не из класса ApplicationException. Вы не должны генерировать исключение ApplicationException в своем коде, и вы не должны перехватывать исключение ApplicationException, если вы не собираетесь повторно генерировать исходное исключение. " -msdn.microsoft.com/en-us/library/…
Вам действительно следует определить собственное исключение: 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.
Наследуйте ApplicationException, рекомендованный Microsoft класс для создания настраиваемых исключений.