Это будет ловить исключения, сгенерированные либо напрямую, либо внутри метода dispose:
try
{
using (MyWrapper wrapper = new MyWrapper())
{
throw new MyException("Bad error.");
}
}
catch ( MyException myex ) {
//deal with your exception
}
catch ( Exception ex ) {
//any other exception thrown by either
//MyWrapper..ctor() or MyWrapper.Dispose()
}
Но это зависит от них, использующих этот код - похоже, вы хотите, чтобы MyWrapper сделал это вместо этого.
Оператор using просто гарантирует, что Dispose всегда вызывается. Это действительно делает это:
MyWrapper wrapper;
try
{
wrapper = new MyWrapper();
}
finally {
if( wrapper != null )
wrapper.Dispose();
}
Звучит так, как вы хотите:
MyWrapper wrapper;
try
{
wrapper = new MyWrapper();
}
finally {
try{
if( wrapper != null )
wrapper.Dispose();
}
catch {
//only errors thrown by disposal
}
}
Я бы посоветовал разобраться с этим в вашей реализации Dispose - вы все равно должны решать любые вопросы во время Disposal.
Если вы связываете какой-то ресурс, где вам нужно, чтобы пользователи вашего API каким-либо образом освободили его, рассмотрите вариант использования метода Close()
. Ваше распоряжение должно также вызывать его (если это еще не было), но пользователи вашего API могут также вызывать его сами, если им необходим более точный контроль.