Появилась такая задача: есть разрабатываемая мною либа, и есть приложение, ее юзающее. В этой либе могут возникать ошибки - например, так:
| Код | 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(...) а продолжать работу, если нужно)
Собственно хотелось бы спросить - это нормальный дизайн проекта? Или лучше как-нить не так сделать (предлагайте варианты).
|