Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > Уведомление вызывающего объекта о ошибке


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

Код

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(...) а продолжать работу, если нужно)

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


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

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

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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)