Можно ли определить, выполняется ли код в настоящее время в контексте обработчика finally
в результате генерирования исключения? Я предпочитаю использовать шаблон IDisposable
для реализации функциональных возможностей ввода/вывода, но одна проблема с этим шаблоном заключается в том, что вы, возможно, не обязательно хотите, чтобы поведение в конце области видимости происходило, если исключение происходит в теле using
. Я бы искал что-то вроде этого:
public static class MyClass
{
public static void MyMethod()
{
using (var scope = MyScopedBehavior.Begin())
{
//Do stuff with scope here
}
}
}
public sealed class MyScopedBehavior : IDisposable
{
private MyScopedBehavior()
{
//Start of scope behavior
}
public void Dispose()
{
//I only want to execute the following if we're not unwinding
//through finally due to an exception:
//...End of scope behavior
}
public static MyScopedBehavior Begin()
{
return new MyScopedBehavior();
}
}
Есть и другие способы, которыми я могу это выполнить (передайте делегат функции, которая окружает вызов с определенным поведением), но мне любопытно, можно ли это сделать с помощью шаблона IDisposable
.
На самом деле это, по-видимому, было спрошено и ответили до здесь. Это можно обнаружить очень хаотичным способом. Я бы не использовал эту технику, но мне интересно знать, что это возможно.