Организация собственного исключения и передача в него исходного исключения - C#
Формулировка задачи:
Для обработки исключений при работе с БД я создал собственное исключение:
Применение исключения при создании новой записи
Таким образом я использую свое исключение для определения места возникновения исключительной ситуации.
У меня возник вопрос... Как мне добавить в свое исключение исходное исключение?
[Serializable]
public class SQLEntityException : ApplicationException
{
public SQLEntityException() { }
public SQLEntityException(string message) : base(message) { }
public SQLEntityException(string message, Exception ex) : base(message) { }
protected SQLEntityException(System.Runtime.Serialization.SerializationInfo info,
System.Runtime.Serialization.StreamingContext contex)
: base(info, contex) { }
//Код ошибки
public int SQLCENativeError { get; set; }
//Название таблицы при работе с которой возникает исключение
public string SQLTableName { get; set; }
//Идентификатор строки в таблице (при переименовании или удалении)
public int SQLEntityID { get; set; }
//Значение параметра (при переименовании или удалении)
public string SQLEntityName { get; set; }
//Тип операции (добавление, удаление, переименование)
public DBOperationType OperationType { get; set; }
}public override int CreateRecord(MainTableStruct mdbs)
{
int i = -1;
SqlCeCommand _cmd = new SqlCeCommand();
_cmd = (SqlCeCommand)GetSqlCommand(mdbs);
if (SQLCeCon.State == ConnectionState.Closed)
{
SQLCeCon.Open();
}
try
{
i = _cmd.ExecuteNonQuery();
}
catch (Exception ex)
{
ExceptionHandler.SQLEntityException exc = new ExceptionHandler.SQLEntityException();
exc.SQLCENativeError = ((SqlCeException)ex).NativeError;
exc.SQLTableName = "MainTableSqlCe";
exc.SQLEntityID = -1;
exc.SQLEntityName = "value";
exc.OperationType = ExceptionHandler.DBOperationType.AddToDB;
throw exc;
}
finally
{
SQLCeCon.Close();
}
return i;
}Решение задачи: «Организация собственного исключения и передача в него исходного исключения»
textual
Листинг программы
public static class ExceptionHandler
{
public static void AppThreadExceptionHandler(object sender, ThreadExceptionEventArgs t)
{
MainExceptioHandler(t.Exception);
}
public static void AppDomainExceptioHandler(object sender, UnhandledExceptionEventArgs args)
{
MainExceptioHandler((Exception)args.ExceptionObject);
}
static void MainExceptioHandler(Exception ex)
{
if (ex is SqlCeException) // Обработка исключений типа SqlCeException
{
switch (((SqlCeException)ex).NativeError)
{
case 25011:
{
MessageBox.Show("Несоответсвующий файл БД");
break;
}
case 25017:
{
MessageBox.Show("Файл БД поврежден");
break;
}
case 25035:
{
MessageBox.Show("Файл занят другим процессом");
break;
}
default:
{
MessageBox.Show("MainExceptionHandle SqlCeException\n"
+ "Message: " + ex.Message
+ "NativeError: \n" + ((SqlCeException)ex).NativeError);
break;
}
}
}
else if (ex is SQLEntityException) // Переход к обработчику исключения типа SQLEntityException
{
SQLEntityExceptionHandler((SQLEntityException)ex);
}
else if (ex is ICSharpCode.SharpZipLib.SharpZipBaseException)
{
MessageBox.Show("Файл поврежден");
}
else if (ex is Exception)
{
MessageBox.Show("MainExceptionHandle Exception\n" + ex.Message +
"\n\n"+ ex.StackTrace);
}
}
//Обработчик исключения типа SQLEntityException
static void SQLEntityExceptionHandler(SQLEntityException ex)
{
string mes = string.Empty;// "Невозможно удалить выбраный проект { 0}";
switch (ex.SQLCENativeError)
{
//Изменения в БД противоречащие FOREIGN KEY Constraint
//Невозможно удалить первичный ключ, так как еще существуют ссылки на этот ключ
//Foreign key constraint
case 25025:
{
if (ex.SQLTableName == "project")
{ mes = string.Format("Невозможно удалить выбраный проект {0}", ex.SQLEntityName); }
else if (ex.SQLTableName == "ispolniteli")
{ { mes = string.Format("Невозможно удалить выбраного исполнителя {0}", ex.SQLEntityName); } }
MessageBox.Show("mes:" + mes);
break;
}
//Повторяющееся значение невозможно вставить в уникальный индекс.
case 25016:
{
if (ex.SQLTableName == "project")
{ mes = string.Format("Невозможно создать или переименовать проект, т.к. проект с именем {0} уже существует", ex.SQLEntityName); }
else if (ex.SQLTableName == "ispolniteli")
{ { mes = string.Format("Невозможно создать или переименовать исполнителя, т.к. исполнитель с именем {0} уже существует", ex.SQLEntityName); } }
MessageBox.Show(ex.Message);
break;
}
//Файл не является файлом формата базы данных SQL Server Compact.
}
}
}