Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.86/7: Рейтинг темы: голосов - 7, средняя оценка - 4.86
4 / 4 / 3
Регистрация: 15.12.2015
Сообщений: 184

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

05.09.2017, 13:20. Показов 1632. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Для обработки исключений при работе с БД я создал собственное исключение:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
[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; }
}
Применение исключения при создании новой записи

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
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;
}
Таким образом я использую свое исключение для определения места возникновения исключительной ситуации.

У меня возник вопрос... Как мне добавить в свое исключение исходное исключение?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
05.09.2017, 13:20
Ответы с готовыми решениями:

Генерация собственного исключения
Попытался кинуть исключение, не получилось. Хочу : Чтобы при вводе варианта (iNoVar) кроме 1го, выводило исключение. Вот написал, но машина...

Передача исключения из дочерней формы в главную
Всем привет! Простая программа: первая форма с кнопкой. По нажатию на кнопку создается вторая форма и открывается private void...

Получить новое число, которое образуется путем исключения средней цифры исходного числа
Здравствуйте, помогите написать программу на Delphi и с формой. Задание: Дано натуральное число N. Если число содержит 5 цифр, то...

8
 Аватар для AnotherDev
20 / 20 / 13
Регистрация: 29.08.2017
Сообщений: 89
05.09.2017, 13:50
У Вас же написано:
C#
1
public SQLEntityException(string message, Exception ex) : base(message) { }
Ну вот и передайте исходное в конструктор
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
05.09.2017, 14:03
C#
1
public SQLEntityException(string message, Exception ex) : base(message, ex) { }

По поводу наследования:
Цитата Сообщение от RuS_984 Посмотреть сообщение
C#
1
public class SQLEntityException : ApplicationException
MSDN:
You should derive custom exceptions from the Exception class rather than the ApplicationException class. You should not throw an ApplicationException exception in your code, and you should not catch an ApplicationException exception unless you intend to re-throw the original exception.
0
4 / 4 / 3
Регистрация: 15.12.2015
Сообщений: 184
05.09.2017, 15:10  [ТС]
Я сделал так:
Кликните здесь для просмотра всего текста

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
static void Main()
{
    //********************************
    //Обработчик событий потока интерфейса
    Application.ThreadException += new ThreadExceptionEventHandler(
        DataModel.SupportClasses.ExceptionHandler.AppThreadExceptionHandler);
 
    Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);
 
 
    AppDomain currentDomain = AppDomain.CurrentDomain;
    currentDomain.UnhandledException += new UnhandledExceptionEventHandler(
        DataModel.SupportClasses.ExceptionHandler.AppDomainExceptioHandler);
 
    // и т.д.
}


Мой общий обработчик исключений
Кликните здесь для просмотра всего текста

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
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.
        }
    }
}


Что я сделал (в моем понимании):
1. Что бы не обрабатывать исключения в каждом конкретном месте, я обрабатываю их в UnhandledExceptionEventHandler
2. Далее, в зависимости от типа исключения, обрабатываю по-своему.
3. Если ни один из конкретных обработчиков не подходит, то я вывожу общее сообщение об ошибке.

Что происходит глобально:
1. В случае ошибки при работе с БД генерируется исключение типа SqlCeException.
2. Я отлавливаю это исключение.
3. Я беру необходимые данные из SqlCeException, дополняю нужными мне данными и выбрасываю новое исключение типа SQLCENativeError.
4. Обрабатываю указанным выше методом и показываю сообщение об ошибке.

По поводу рекомендации MSDN. У меня получается как и рекомендует MSDN, а именно, я наследую свое исключение от ApplicationException, заполняю его данными и бросаю его дальше.
Я правильно понимаю рекомендацию MSDN?

Цитата Сообщение от kolorotur Посмотреть сообщение
public SQLEntityException(string message, Exception ex) : base(message, ex) { }
Я правильно понимаю, исключение появится в SQLEntityException.InnerException ?
0
911 / 796 / 329
Регистрация: 08.02.2014
Сообщений: 2,391
05.09.2017, 15:27
Цитата Сообщение от RuS_984 Посмотреть сообщение
По поводу рекомендации MSDN. У меня получается как и рекомендует MSDN, а именно, я наследую свое исключение от ApplicationException
Вы должны получать пользовательские исключения из класса Exception, а не класса ApplicationException. Именно это они рекомендуют, а не как вы сказали.
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
05.09.2017, 15:29
Цитата Сообщение от RuS_984 Посмотреть сообщение
Я правильно понимаю рекомендацию MSDN?
Нет, там написано что надо наследовать свои исключения от Exception, а не ApplicationException.

Цитата Сообщение от RuS_984 Посмотреть сообщение
Я правильно понимаю, исключение появится в SQLEntityException.InnerException ?
Да.
0
4 / 4 / 3
Регистрация: 15.12.2015
Сообщений: 184
05.09.2017, 15:42  [ТС]
А в целом мой подход к обработке исключений правильный или нет?
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
05.09.2017, 17:26
Цитата Сообщение от RuS_984 Посмотреть сообщение
в целом мой подход к обработке исключений правильный или нет?
Я бы вместо автосвойств с публичными геттерами/сеттерами использовал readonly поля/свойства с приватными сеттерами.
0
4 / 4 / 3
Регистрация: 15.12.2015
Сообщений: 184
05.09.2017, 18:11  [ТС]
Для того чтобы можно было проинициализировать поля один раз в конструкторе?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
05.09.2017, 18:11
Помогаю со студенческими работами здесь

Получить новое число, которое образуется путем исключения средней цифры исходного числа
Дано натуральное число N. Если число содержит 5 цифр, то получить новое число М, которое образуется путем исключения средней цифры...

Получить новое число M, которое образуется путем исключения средней цифры исходного числа
Весь код с функцией getch() пожалуйста

Передача исключения из одного catch-блока в другой
Всем привет! Начал тут изучать исключения в С++, хотел бы кое-что прояснить. Если я всё правильно понял, процесс обработки исключений...

Перегрузка WebClient.GetRequest() и передача исключения вверх по стеку
Здравствуйте. Я расширил WebClient, чтобы пользоваться Cookies и некоторыми другими вещами. //CookieAwareWebClient.cs using System; ...

Почему встроенные исключения Java, требующие использования throws, по факту обходятся без него?
Почему встроенные исключения Java, требующие использования throws, по факту обходятся без него? Я имею ввиду, например...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru