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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Уведомление вызывающего объекта о ошибке 
:(
    Опции темы
Jamon
Дата 31.5.2010, 01:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



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

Код

if (...)
{
 //некоторое обязательное условие выполнено, можно безопасно работать
}
else 
{
//не выполнено, нужно прервать работу
}


Ну в общем более менее очевидная ситуация. Теперь, если вот эта ошибка произошла (т.е. не было выполнено условие), то об этом нужно как то информировать вызывающий объект. Первое что пришло в голову - это рейзить объект специфического исключения:

Код

else
{
//произошла ошибка, нужно сказать клиенту
throw new SomeSpecificException("...");
}


Но тут проблема появилась - вызывающий метод, получив такой эксепшн, прерывает свою работу и сваливается в свой собственный блок catch(...). Но ведь это может быть не смертельная ошибка, и вполне можно из упавшего метода вернуть какое то специфическое значение (означающее ошибку), и клиент будет знать - произошла ошибка в либе, нужно продолжать работу, зная это. В итоге я начал делать так:

Код

...
public delegate void PutErrorInfo(string info, Exception ex);
...
public static PutErrorInfo TransferErrorInfo;
...

try
{
....

else
{
//произошла ошибка, нужно сказать клиенту
TransferErrorInfo("...", null);
}
...

}catch(Exception ex)
{
TransferInfo("...", ex);
}

return null;



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

Собственно хотелось бы спросить - это нормальный дизайн проекта? Или лучше как-нить не так сделать (предлагайте варианты).


PM MAIL   Вверх
jonie
Дата 31.5.2010, 08:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 22
Всего: 118



паттерн Observer вам поможет... например вы можете сделать event и дергать его, а вызывающий уже пусть на него подписывается.


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
Jamon
Дата 31.5.2010, 10:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(jonie @ 31.5.2010,  08:58)
например вы можете сделать event и дергать его, а вызывающий уже пусть на него подписывается.

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

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


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

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


 




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


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

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