Estamos investigando un patrón de codificación en C# en el que nos gustaría usar una cláusula "using" con una clase especial, cuyo método Dispose()
hace cosas diferentes dependiendo de si el cuerpo "using" se salió normalmente o con una excepción .¿Cómo determinar si se está manejando una excepción .NET?
Según entiendo, CLR realiza un seguimiento de la excepción actual que se maneja hasta que se ha consumido por un controlador "catch". Sin embargo, no está del todo claro si esta información está expuesta de alguna manera para que el código acceda. ¿Sabes si es, y si es así, cómo acceder?
Por ejemplo:
using (var x = new MyObject())
{
x.DoSomething();
x.DoMoreThings();
}
class MyObject : IDisposable
{
public void Dispose()
{
if (ExceptionIsBeingHandled)
Rollback();
else
Commit();
}
}
Esto se ve casi como System.Transactions.TransactionScope
, excepto que el éxito/fracaso no está determinada por una llamada a x.Complete()
, sino más bien en función de si el cuerpo using
se terminó normalmente.
Creo que debe preguntar por qué está tratando de hacer esto. El patrón Dispose() no tiene la intención de implementar lógica de control al generar excepciones. –
Siempre es un buen momento para cuestionar toda la idea. Aprecio que no es así como se debe usar "usar". Aprecio que puede conducir a un código incorrecto. Todavía estoy interesado en una respuesta :) –
¿Por qué esta pregunta es downvoted? – Olli