Модераторы: Partizan, gambit

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> обработчик исключений 
:(
    Опции темы
zss
Дата 19.1.2007, 11:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 708
Регистрация: 17.6.2004

Репутация: нет
Всего: 2



есть класс, который в любом методе может кинуть исключение.
Хотелось бы не засорять код try/catch, а передать в него метод, который бы вызывался при исключении.

Как правило в этом методе необходимо остановить все потоки и сделать просто невидимыми кнопки.
Еще бы хотелось в этот метод передать само исключение, чтоб можно было бы вывести сообщение об ошибке.

Как это правильно сделать ?
PM MAIL ICQ   Вверх
mr.DUDA
Дата 19.1.2007, 12:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 110
Всего: 232



Есть событие AppDomain.CurrentDomain.UnhandledException, генерится при необработанном исключении в рамках всего приложения.


--------------------
user posted image
PM MAIL WWW   Вверх
zss
Дата 19.1.2007, 12:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 708
Регистрация: 17.6.2004

Репутация: нет
Всего: 2



Цитата(mr.DUDA @  19.1.2007,  12:07 Найти цитируемый пост)
Есть событие AppDomain.CurrentDomain.UnhandledException, генерится при необработанном исключении в рамках всего приложения. 

а что это даст ? И с чем его едят smile
PM MAIL ICQ   Вверх
Naum
Дата 19.1.2007, 13:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 743
Регистрация: 7.9.2005
Где: Саратов, ул. Поса дского, 298

Репутация: 8
Всего: 15



Цитата(zss @  19.1.2007,  12:38 Найти цитируемый пост)
метод, который бы вызывался при исключении.

Этот метод и есть обработчик события AppDomain.CurrentDomain.UnhandledException.




--------------------
У нас всего два праздника Новый год и ТЯПница.
PM MAIL ICQ   Вверх
zss
Дата 19.1.2007, 13:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 708
Регистрация: 17.6.2004

Репутация: нет
Всего: 2



брр.... ничего не понял
PM MAIL ICQ   Вверх
zss
Дата 20.1.2007, 16:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 708
Регистрация: 17.6.2004

Репутация: нет
Всего: 2



мне нет необходимости ловить все исключения глобально. Нужно лишь ловить исключения от одного класса

Добавлено @ 16:42 
кстати зачем вообще этот обработчик, если код
Код

    static class Program
    {
        [MTAThread]
        static void Main()
        {
            try
            {
                Application.Run(new MainForm());
            }
            catch
            {
                Message.error("Непредвиденное завершение приложения");
            }
        }
    }


должен позволять это делать. Но как показала практика он этого не делает smile
PM MAIL ICQ   Вверх
awers
Дата 20.1.2007, 17:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1465
Регистрация: 22.3.2006
Где: Россия, Таганрог

Репутация: нет
Всего: 31



zss, а с чего вдруг он будет ловить все исключения? он и ловит сам Application.Run.
а AppDomain.CurrentDomain.UnhandledException самый лучший способ ..
PM MAIL WWW ICQ Skype   Вверх
zss
Дата 20.1.2007, 17:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 708
Регистрация: 17.6.2004

Репутация: нет
Всего: 2



Цитата(awers @  20.1.2007,  17:07 Найти цитируемый пост)
zss, а с чего вдруг он будет ловить все исключения? он и ловит сам Application.Run.
а AppDomain.CurrentDomain.UnhandledException самый лучший способ ..

но ведь если исключение возникнет, то оно будет в первичном потоке приложения (или в порожденных потоках)

А вообще может быть я не совсем туда копаю smile

Я ловлю SocketException. Я хочу в методах при любой ошибке возвращать статус завершения,
а лишь только если сокет закрылся или обрыв - тогда дергать метод в котором отработает нужный код.

Еще правда не совсем понятно как отделить эти типы исключений друг от друга

Добавлено @ 17:14 
Еще не соасем понят как поступить с оэтим объектом, если из блока catch будет вызван метод,
а в самом методе нужно прибить этот объект.

Что можно здесь придумать ?
PM MAIL ICQ   Вверх
awers
Дата 20.1.2007, 17:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1465
Регистрация: 22.3.2006
Где: Россия, Таганрог

Репутация: нет
Всего: 31



а вообще помоему непрально использовать общее исключение для всего. когда писал либу для использования MySQL, приходилось изголяться капитально: 
Код

            catch (MySqlException obj) 
// Если первым будет стоять Exception, MySqlException уже не будет вызван
// Все ошибки будут обработаны стандартным Exception
            {  
                last_error = obj.Message.ToString();
                return false;
            }
            catch (Exception obj) 
            {
                last_error = "Сервер не найден";
                return false;
            }



А отсутствие Мускуль сервера - MySqlException  не обрабатывает smile

Это сообщение отредактировал(а) awers - 20.1.2007, 17:36
PM MAIL WWW ICQ Skype   Вверх
zss
Дата 21.1.2007, 12:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 708
Регистрация: 17.6.2004

Репутация: нет
Всего: 2



Цитата(awers @  20.1.2007,  17:35 Найти цитируемый пост)
а вообще помоему непрально использовать общее исключение для всего. когда писал либу для использования MySQL, приходилось изголяться капитально

но обработка всех типов исключений для каждого вызова метода
это мне кажется еще большим извращением

З.Ы. Что за идиот придумал бросать исключения в методах класса...
PM MAIL ICQ   Вверх
ivashkanet
Дата 22.1.2007, 10:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


Профиль
Группа: Участник Клуба
Сообщений: 3684
Регистрация: 23.2.2006
Где: Гомель, Беларусь

Репутация: 47
Всего: 149



Цитата(zss @  21.1.2007,  11:50 Найти цитируемый пост)
З.Ы. Что за идиот придумал бросать исключения в методах класса...

А где их еще бросать?

По делу:
Словить кинутое исключение может только сам метод либо метод, который находиться выше него в цепочке вызовов.
Поэтому все точки входа в твой класс придеться оборачивать в try/catch. И ничего с этим не поделаешь  smile 

Либо, как уже говорили, можно ловить событие AppDomain.CurrentDomain.UnhandledException.
Но тогда это придеться настраивать во всех приложениях, которые будут работать с твоим классом (ИМХО), что не есть гуд 

PM MAIL WWW ICQ   Вверх
zss
Дата 22.1.2007, 10:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 708
Регистрация: 17.6.2004

Репутация: нет
Всего: 2



ivashkanet, а что если ловить исключения внутри класса и при критичных вываливать свое или например вызывать событие ?
PM MAIL ICQ   Вверх
ivashkanet
Дата 22.1.2007, 11:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


Профиль
Группа: Участник Клуба
Сообщений: 3684
Регистрация: 23.2.2006
Где: Гомель, Беларусь

Репутация: 47
Всего: 149



Цитата(zss @  22.1.2007,  09:42 Найти цитируемый пост)
ivashkanet, а что если ловить исключения внутри класса и при критичных вываливать свое или например вызывать событие ?

Легко:
Код

            try
            {

            }
            catch (Exception e)
            {
                // исключение 
                throw new ExtendedException("Чёрте что твориться", e);
                // событие
                Exceptioned(this, e);
            }


Но это все равно не избавит тебя от Try/Catch, т.е не поможет решить проблемму:
Цитата(zss @  19.1.2007,  10:38 Найти цитируемый пост)
Хотелось бы не засорять код try/catch, а передать в него метод, который бы вызывался при исключении.


Добавлено @ 11:02 
Цитата(ivashkanet @  22.1.2007,  10:01 Найти цитируемый пост)
т.е не поможет решить проблемму

Которая, ИМХО, совсем не проблемма, а следствие ленности smile
PM MAIL WWW ICQ   Вверх
zss
Дата 22.1.2007, 12:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 708
Регистрация: 17.6.2004

Репутация: нет
Всего: 2



Цитата(ivashkanet @  22.1.2007,  11:01 Найти цитируемый пост)
Но это все равно не избавит тебя от Try/Catch, т.е не поможет решить проблемму:


Цитата(ivashkanet @  22.1.2007,  11:01 Найти цитируемый пост)
Которая, ИМХО, совсем не проблемма, а следствие ленности

да нет - я не неленив smile просто очень тяжело потом читать код. А тут все try/catch можно скрыть внутри класса. Один раз просто написать
код обрабатывающий исключения и для пользователя класса будет меньше писать. Нужно лишь только обратотать сопытие при критической ситуации smile
PM MAIL ICQ   Вверх
zss
Дата 22.1.2007, 21:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 708
Регистрация: 17.6.2004

Репутация: нет
Всего: 2



в общем примерно сделал

но появились проблеммы

у меня есть класс в котором я обрабатываю исключения и вызываю событие если нужно.
Пусть это класс A; у него например есть методы write и read, которые могут дернуть событие.
Также есть класс B, который содержит А. Я создаю внутри В класс А и подписываюсь на сообщение.

Код

public class B
{
    private A a = null;
    private Thread m_thread = null;
    private bool stopped = false;

    public void OnMethod ()
    {
        if (m_thread != null)
        {
            stopped = true;
            m_thread.Join();
            m_thread = null;
        }
    }
    public void Create ()
    {
        a = new A();
        a.OnMethod += OnMethod;
    }
}


теперь у меня в В есть поток, который вызывает методы класса А.
Код

private void MainThread()
{
    while (!stopped)
    {
        a.write(...);
        ....
        a.read(...);
    }
}


Если в потоке произойдет исключение в методе write или read, то будет вызвано событие OnMethod
в котором я пытаюсь остановить поток. 

Вопрос: дождусь ли я его ?

Добавлено @ 21:28 
И если нет, то можно ли событие вызвать ассинхронно ?
PM MAIL ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0550 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.