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