Организация собственного исключения и передача в него исходного исключения - 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.
        }
    }
}

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


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

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

11   голосов , оценка 3.818 из 5
Похожие ответы