James, Todo wrapper
puede hacer es registrar sus propias excepciones. No puede obligar al consumidor de wrapper
a registrar sus propias excepciones. Eso no es para lo que IDisposable es. IDisposable está destinado a la liberación semideterminista de recursos para un objeto. Escribir el código correcto IDisposable no es trivial.
De hecho, ni siquiera se requiere que el consumidor de la clase llame al método de eliminación de clases, ni se le requiere usar un bloque de uso, por lo que todo se descompone.
Si lo mira desde el punto de vista de la clase contenedora, ¿por qué debería importar que estuviera presente dentro de un bloque de uso y hubo una excepción? ¿Qué conocimiento trae eso? ¿Es un riesgo de seguridad tener un código de terceros informado de los detalles de las excepciones y del seguimiento de la pila? ¿Qué puede hacer wrapper
si hay una división por cero en un cálculo?
La única forma de registrar excepciones, independientemente de IDisposable, es try-catch y luego volver a lanzar en el catch.
try
{
// code that may cause exceptions.
}
catch(Exception ex)
{
LogExceptionSomewhere(ex);
throw;
}
finally
{
// CLR always tries to execute finally blocks
}
menciona que va a crear una API externa. Tendría que ajustar cada llamada en el límite público de su API con try-catch para registrar que la excepción provino de su código.
Si está escribiendo una API pública, entonces realmente debería leer Framework Design Guidelines: Conventions, Idioms, and Patterns for Reusable .NET Libraries (Microsoft .NET Development Series) - 2nd Edition .. 1st Edition.
Si bien no abogan por ellos, he visto IDisposable utilizado para otros patrones interesantes:
- la semántica de transacción auto-rollback. La clase de transacción revertiría la transacción en Dispose si aún no se ha comprometido.
- Bloques de código temporizados para el registro. Durante la creación del objeto, se grabó una marca de tiempo, y en Dispose se calculó TimeSpan y se escribió un evento de registro.
* Estos patrones se pueden lograr con otra capa de direccionamiento indirecto y delegados anónimos fácilmente y sin tener que sobrecargar la semántica IDisposable. La nota importante es que su envoltorio IDisposable es inútil si usted o un miembro del equipo se olvida de usarlo correctamente.
¿Por qué su envoltorio para la implementación de IDisposable necesita saber por qué se está desechando? –
Quiero escribir un mensaje de registro y sería bueno saber si el código dentro de la declaración se ejecutó correctamente o si se produjo a mitad de camino debido a una excepción. –
Eche un vistazo a esto desde ayende http://ayende.com/Blog/archive/2007/06/20/Did-you-know-Find-out-if-an-exception-was-thrown.aspx –