Джеймс, Все, что wrapper
может сделать, это записать свои собственные исключения. Вы не можете заставить потребителя wrapper
регистрировать свои собственные исключения. Это не то, что IDisposable для. IDisposable предназначен для полудетерминированного высвобождения ресурсов для объекта. Написание правильного кода IDisposable не тривиально.
На самом деле, от потребителя класса даже не требуется вызывать метод распоряжения ваших классов, и при этом они не обязаны использовать блок using, так что все это скорее сломается.
Если вы посмотрите на него с точки зрения класса-обёртки, почему его должно заботить, чтобы он присутствовал внутри блока using и было исключение? Какие знания это приносит? Есть ли угроза безопасности, когда сторонний код становится доступным к деталям исключений и трассировке стека? Что может wrapper
сделать, если в расчете есть деление на ноль?
Единственный способ регистрировать исключения, независимо от IDisposable, - это try-catch, а затем перебрасывание в catch.
try
{
// code that may cause exceptions.
}
catch( Exception ex )
{
LogExceptionSomewhere(ex);
throw;
}
finally
{
// CLR always tries to execute finally blocks
}
Вы упоминаете, что создаете внешний API. Вам нужно будет обернуть каждый вызов на открытой границе вашего API с помощью try-catch, чтобы записать, что исключение пришло из вашего кода.
Если вы пишете общедоступный API, то вам действительно следует прочитать Рекомендации по проектированию платформы: условные обозначения, идиомы и шаблоны для повторно используемых библиотек .NET (Microsoft .NET Development Series) - 2-е издание .. 1-е издание .
Хотя я не защищаю их, я видел IDisposable, используемый для других интересных шаблонов:
- Семантика автооткатных транзакций. Класс транзакции откатит транзакцию при Dispose, если она еще не зафиксирована.
- Временные кодовые блоки для регистрации. Во время создания объекта была записана временная метка, а при утилизации был рассчитан интервал времени и записано событие журнала.
* Эти шаблоны могут быть достигнуты с помощью другого уровня косвенных и анонимных делегатов легко и без необходимости перегружать семантику IDisposable. Важным примечанием является то, что ваша оболочка IDisposable бесполезна, если вы или член команды забудете ее правильно использовать.