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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Отлов эксепшнов 
:(
    Опции темы
HAL707
Дата 13.8.2009, 12:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

Репутация: 1
Всего: 4



Привет всем.
Столкнулся я с проблемой.
Короче есть класс, с кучей методов. Возвращаемое значение и сигнатура у всех разные.
Существует вероятность, что все эти методы в какой-то момент времени кидают одно и тоже исключение.
Оборачивать вызов каждого метода в try catch и каждый производить одни и те же действия мне бы
не хотелось.
Вопрос в том, как написать такой класс, который сам совит эксепшны для всех методов, а 
возвращает только результат - успешно, неуспешно?
Например есть вызов метода метода:
string AnyMethod(string param1)

Он кидает эксепшн.
Нужно преобразовать его в bool AnyMethod(string param1, out result)
в описании AnyMethod нельзя использовать Try-catch

как?

PM MAIL   Вверх
IGV
Дата 13.8.2009, 12:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Если честно, то я не очень понял чего Вы всё-таки хотите добиться. 
Как вариант можно обойтись вообще без исключений:
добавить в класс переменную состояния, которая будет содержать текст сообщения
например
Код

enum State
{
     Done,
     Error,
     Waiting
}


....
public State state { get; private set; }
public string Message {get; private set; }

Если случается в методе исключительная ситуация, метод прекращает свою работу и меняет состояние на Error и в Message пишет какую-то информацию для Вас.

После вызова метода проверяете его состояние и принимаете решение о дальнейших действиях.
PM MAIL ICQ   Вверх
HAL707
Дата 13.8.2009, 13:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

Репутация: 1
Всего: 4



Я хочу чтобы все исключения обрабатывались в единственном методе.
Поясню на примере.
Есть класс с двумя "опасными методами"
string anyclass.Method1()
string anyclass.Method2()
Пишем такой код:
Код

bool IsError;
T ExCat<T>(Func<T> f)
            {
                IsError = false;
                T result = default(T);
                try
                {
                    result = f();
                    return result;
                }
                catch(Exception) 
                { 
                    //какая то обработка
                }
                return result;
            }

 public bool Method1(out string result)
            {
                result = ExCat(new Func<string>() => anyclass.Method1()));
                return IsError;
            }

 public bool Method2(out string result)
            {
                result = ExCat(new Func<string>() => anyclass.Method2()));
                return IsError;
            }


Все эксепшны обрабатываются в одном месте. Красота.
Но это катит только тогда, когда у метода 1 ретурн-параметр и он ничего не принимает.
А методов много, у всех параметры разные, и некоторые ничего не возвращают.

Это сообщение отредактировал(а) HAL707 - 13.8.2009, 13:12
PM MAIL   Вверх
azesmcar
Дата 13.8.2009, 13:18 (ссылка) |   (голосов:4) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


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

Репутация: 6
Всего: 211



HAL707

Цитата(HAL707 @  13.8.2009,  12:02 Найти цитируемый пост)
Существует вероятность, что все эти методы в какой-то момент времени кидают одно и тоже исключение.
Оборачивать вызов каждого метода в try catch и каждый производить одни и те же действия мне бы
не хотелось.


Убило smile
это что еще?? smile 
так прямо пучком все методы экзепшны кидают совместными усилиями? Сегодня вечером, группа методов микрософтовской реализации, по предварительному сговору..умышленно бросили исключение на произвол судьбы. По данному вопросу было возбуждено два программиста и один менеджер среднего звена. Экзепшн пойман, ведется следствие.

Все экзепшны наследуют от Exception, лови его в функции Main, если речь конечно об этом smile 
А чтобы класс сам ловил исключения..это вы уважаемый научной фантастики начитались smile

Это сообщение отредактировал(а) azesmcar - 13.8.2009, 13:29
PM   Вверх
ДобренькийПапаша
Дата 13.8.2009, 13:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1278
Регистрация: 14.1.2006
Где: г.Москва

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



Если именно что-то конкретное вызывает сие: то в условии при котором сие происходит сделайте throw Ваше_Исключение
Создайте своё исключение и обработайте...

А вообще-то, то что сказал предыдущий оратор похоже на правду smile 


--------------------
Меня зовут Себастьян Парейра, торговец чёрным деревом.
PM MAIL   Вверх
HAL707
Дата 13.8.2009, 16:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

Репутация: 1
Всего: 4



Стоп.
Если бы я хотел ловить его в функции main, я бы там его бы и ловил.
В определенный момент (когда сервер отваливается)
методы класса (все) кидают ComException.
Я, не хочу в функции main оборачивать каждый вызов в try-catch.
А что я хочу, написано мной выше.

Еще раз спрашиваю, возможно ли это сделать?
PM MAIL   Вверх
azesmcar
Дата 13.8.2009, 16:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


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

Репутация: 6
Всего: 211



Цитата(HAL707 @  13.8.2009,  16:02 Найти цитируемый пост)
В определенный момент (когда сервер отваливается)
методы класса (все) кидают ComException.

Скажу еще один раз, ВСЕ ВМЕСТЕ exception не кидают. Нет, ну можно конечно создать по одному потоку на каждый метод и каждый будет генерировать по исключению, будет очень весело определенно, но не практично, сомневаюсь что в микрософт на такое способны. Это делает кто-то один и сваливает вину на других, надо его найти и надавать по попе. Покажи код и расскажи нормально что происходит, написанное тобой ни хрена мне (я так думаю не только мне) не говорит.

Цитата(HAL707 @  13.8.2009,  16:02 Найти цитируемый пост)
Я, не хочу в функции main оборачивать каждый вызов в try-catch.
А что я хочу, написано мной выше.

Я об этом и говорю, не надо каждый вызов заворачивать, возьми всю функцию в один try-catch.

Это сообщение отредактировал(а) azesmcar - 13.8.2009, 16:11
PM   Вверх
mihryak
Дата 13.8.2009, 16:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 19
Всего: 36



каким-то чудовищным непониманием сквозит топик smile

azesmcar, речь вовсе не о том, что все методы в один момент времени вдруг кидают исключение, и не о том, можно ли всю функцию завернуть в try-catch - конечно можно!

дело в другом - есть некий com-объект, который славится киданием исключений, и совсем не хочется каждый его вызов заворачивать в try-catch, вместо этого хорошо бы написать обобщённый "выполнятель" этих методов, который мог бы отловить и обработать исключение


HAL707, к сожалению, void не признаётся разработчиками шарпа как тип возвращаемого значения, так что там, где ничего не возвращается, нужно будет использовать Action вместо Func
а с количеством праметров проблем нет и в твоём варианте - 
Код

            value = ExCat<string>(() => DateTime.Now.ToString());
            value = ExCat<string>(() => DateTime.Now.ToString("HH:mm:ss"));
            value = ExCat<string>(() => DateTime.Now.ToString("HH:mm:ss", null));


ещё на какие-нибудь мысли может навести эта тема


PM MAIL ICQ   Вверх
azesmcar
Дата 13.8.2009, 17:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


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

Репутация: 6
Всего: 211



Цитата(mihryak @  13.8.2009,  16:48 Найти цитируемый пост)
каким-то чудовищным непониманием сквозит топик smile

Ну это тебе сейчас что-то понятно, на момент написания мною сообщения тут было
первое сообщение
Цитата(HAL707 @  13.8.2009,  12:02 Найти цитируемый пост)
все эти методы в какой-то момент времени кидают одно и тоже исключение...

и вместо второго сообщения было только
Цитата

Я хочу чтобы все исключения обрабатывались в единственном методе.

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

Цитата(mihryak @  13.8.2009,  16:48 Найти цитируемый пост)
azesmcar, речь вовсе не о том, что все методы в один момент времени вдруг кидают исключение, и не о том, можно ли всю функцию завернуть в try-catch - конечно можно!

заметь, это не я придумал, так написано smile 

Это сообщение отредактировал(а) azesmcar - 13.8.2009, 17:02
PM   Вверх
HAL707
Дата 13.8.2009, 17:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

Репутация: 1
Всего: 4



mihryak в теме  smile 

А насчет все эти методы в какой-то момент времени кидают одно и тоже исключение...
Ну неудачно выразился.
 Имелось ввиду, что при вызове любого из методов, прилетит одно и тоже исключение.

но автор вместо того, чтобы написать новый пост (чтобы люди заметили), решил отредактировать старый, на который уже никто и внимания не обращал.
Ну не успеешь отредактировать, уже все прочитают smile 
PM MAIL   Вверх
PashaPash
Дата 13.8.2009, 18:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1233
Регистрация: 3.1.2008

Репутация: 13
Всего: 49



HAL707, Policy Injection Application Block + The Exception Handling Handler. Или любая другая AOP-примочка.


--------------------
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

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


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

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


 




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


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

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