Организация собственного исключения и передача в него исходного исключения - 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. } } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д