Организация собственного исключения и передача в него исходного исключения - C#

Узнай цену своей работы

Формулировка задачи:

Для обработки исключений при работе с БД я создал собственное исключение:
Листинг программы
  1. [Serializable]
  2. public class SQLEntityException : ApplicationException
  3. {
  4. public SQLEntityException() { }
  5. public SQLEntityException(string message) : base(message) { }
  6. public SQLEntityException(string message, Exception ex) : base(message) { }
  7. protected SQLEntityException(System.Runtime.Serialization.SerializationInfo info,
  8. System.Runtime.Serialization.StreamingContext contex)
  9. : base(info, contex) { }
  10. //Код ошибки
  11. public int SQLCENativeError { get; set; }
  12. //Название таблицы при работе с которой возникает исключение
  13. public string SQLTableName { get; set; }
  14. //Идентификатор строки в таблице (при переименовании или удалении)
  15. public int SQLEntityID { get; set; }
  16. //Значение параметра (при переименовании или удалении)
  17. public string SQLEntityName { get; set; }
  18. //Тип операции (добавление, удаление, переименование)
  19. public DBOperationType OperationType { get; set; }
  20. }
Применение исключения при создании новой записи
Листинг программы
  1. public override int CreateRecord(MainTableStruct mdbs)
  2. {
  3. int i = -1;
  4. SqlCeCommand _cmd = new SqlCeCommand();
  5. _cmd = (SqlCeCommand)GetSqlCommand(mdbs);
  6. if (SQLCeCon.State == ConnectionState.Closed)
  7. {
  8. SQLCeCon.Open();
  9. }
  10. try
  11. {
  12. i = _cmd.ExecuteNonQuery();
  13. }
  14. catch (Exception ex)
  15. {
  16. ExceptionHandler.SQLEntityException exc = new ExceptionHandler.SQLEntityException();
  17. exc.SQLCENativeError = ((SqlCeException)ex).NativeError;
  18. exc.SQLTableName = "MainTableSqlCe";
  19. exc.SQLEntityID = -1;
  20. exc.SQLEntityName = "value";
  21. exc.OperationType = ExceptionHandler.DBOperationType.AddToDB;
  22. throw exc;
  23. }
  24. finally
  25. {
  26. SQLCeCon.Close();
  27. }
  28. return i;
  29. }
Таким образом я использую свое исключение для определения места возникновения исключительной ситуации. У меня возник вопрос... Как мне добавить в свое исключение исходное исключение?

Решение задачи: «Организация собственного исключения и передача в него исходного исключения»

textual
Листинг программы
  1. public static class ExceptionHandler
  2. {
  3.     public static void AppThreadExceptionHandler(object sender, ThreadExceptionEventArgs t)
  4.     {
  5.         MainExceptioHandler(t.Exception);
  6.     }
  7.  
  8.     public static void AppDomainExceptioHandler(object sender, UnhandledExceptionEventArgs args)
  9.     {
  10.         MainExceptioHandler((Exception)args.ExceptionObject);
  11.     }
  12.  
  13.     static void MainExceptioHandler(Exception ex)
  14.     {
  15.  
  16.         if (ex is SqlCeException) // Обработка исключений типа SqlCeException
  17.         {
  18.             switch (((SqlCeException)ex).NativeError)
  19.             {
  20.                 case 25011:
  21.                     {
  22.                         MessageBox.Show("Несоответсвующий файл БД");
  23.                         break;
  24.                     }
  25.  
  26.                 case 25017:
  27.                     {
  28.                         MessageBox.Show("Файл БД поврежден");
  29.                         break;
  30.                     }
  31.                 case 25035:
  32.                     {
  33.                         MessageBox.Show("Файл занят другим процессом");
  34.                         break;
  35.                     }
  36.                 default:
  37.                     {
  38.                         MessageBox.Show("MainExceptionHandle SqlCeException\n"
  39.                                                         + "Message: " + ex.Message
  40.                                                         + "NativeError: \n" + ((SqlCeException)ex).NativeError);
  41.                         break;
  42.                     }
  43.             }
  44.         }
  45.         else if (ex is SQLEntityException) // Переход к обработчику исключения типа SQLEntityException
  46.         {
  47.             SQLEntityExceptionHandler((SQLEntityException)ex);
  48.         }
  49.         else if (ex is ICSharpCode.SharpZipLib.SharpZipBaseException)
  50.         {
  51.             MessageBox.Show("Файл поврежден");
  52.         }
  53.         else if (ex is Exception)
  54.         {
  55.             MessageBox.Show("MainExceptionHandle Exception\n" + ex.Message +
  56.                 "\n\n"+ ex.StackTrace);
  57.         }
  58.     }
  59.    
  60.     //Обработчик исключения типа SQLEntityException
  61.     static void SQLEntityExceptionHandler(SQLEntityException ex)
  62.     {
  63.         string mes = string.Empty;// "Невозможно удалить выбраный проект { 0}";
  64.  
  65.         switch (ex.SQLCENativeError)
  66.         {
  67.             //Изменения в БД противоречащие FOREIGN KEY Constraint
  68.             //Невозможно удалить первичный ключ, так как еще существуют ссылки на этот ключ
  69.             //Foreign key constraint
  70.             case 25025:
  71.                 {
  72.                     if (ex.SQLTableName == "project")
  73.                     { mes = string.Format("Невозможно удалить выбраный проект {0}", ex.SQLEntityName); }
  74.                     else if (ex.SQLTableName == "ispolniteli")
  75.                     { { mes = string.Format("Невозможно удалить выбраного исполнителя  {0}", ex.SQLEntityName); } }
  76.  
  77.                     MessageBox.Show("mes:" + mes);
  78.                 break;
  79.                 }
  80.             //Повторяющееся значение невозможно вставить в уникальный индекс.
  81.             case 25016:
  82.                 {
  83.                     if (ex.SQLTableName == "project")
  84.                     { mes = string.Format("Невозможно создать или переименовать проект, т.к. проект с именем {0} уже существует", ex.SQLEntityName); }
  85.                     else if (ex.SQLTableName == "ispolniteli")
  86.                     { { mes = string.Format("Невозможно создать или переименовать  исполнителя, т.к. исполнитель с именем {0} уже существует", ex.SQLEntityName); } }
  87.  
  88.                     MessageBox.Show(ex.Message);
  89.                     break;
  90.                 }
  91.             //Файл не является файлом формата базы данных SQL Server Compact.
  92.         }
  93.     }
  94. }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

11   голосов , оценка 3.818 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы