Могу ли я удалить блок using после того, как внешняя попытка / catch поймает исключение?

#c# #try-catch #using #idisposable

#c# #попытка-перехват #использование #idisposable

Вопрос:

 try
{
    using (Ctx.Push("going to run func1"))
    {
        func1();

        using (Ctx.Push("going to run func2"))
        {
            throw new Exception("something wrong before running func2");
            func2();
        }
    }
}
catch (Exception ex) {
    Console.WriteLine(Ctx.GetStack());

    // actual output: { }
    // output I want to get: { "going to run func1", "going to run func2" }

}
 

Пожалуйста, рассмотрите приведенный выше код.

Предполагается, что Ctx.Push это статический метод класса, который Push передает сообщение в контекстный стек и Pop это сообщение из стека при удалении. Это означает, что я могу получить контекстный стек внутри этих using блоков, поскольку они не были удалены. Однако, если в этом блоке возникнет какое-либо исключение using , и я потеряю этот контекстный стек, поскольку контекстный стек будет удален до достижения catch блока.

Могу ли я узнать, есть ли какой-либо способ логически добиться чего-то вроде отсрочки действия Dispose() после обнаружения внешнего исключения?

  • Добавление try / catch внутри каждого using блока не является решением для меня, поскольку мне это действительно не нужно, это делает код таким запутанным.
  • Вызов Ctx.push() и Dispose() вручную также не является для меня проблемой. Поскольку это довольно опасно, когда другой сотрудник в проекте в конечном итоге забывает об Dispose() этом.

Я знаю, что это может быть невозможно. Любой другой подход / решение будет приветствоваться, если я смогу решить эту проблему.

Заранее благодарю вас.

Комментарии:

1. using Блок — это всего лишь короткая рука try { } finally { resource.Dispose(); } , поэтому, конечно, вы не можете прекратить использование using и не вызывать Dispose() вручную, так как тогда вы никогда не вызывали Dispose

2. Удаление не обязательно означает, что что-то непригодно для использования; завершение делает. Это Ctx класс, который вы контролируете? Если да, пожалуйста, опубликуйте его. Информация, которую он накапливает, может быть сохранена для вашего вызова GetStack , но нет способа узнать, не видя кода.

3. На самом деле, вы объединили отдельные IDisposable экземпляры, которые Push возвращаются, со статической информацией, которая Ctx поддерживается либо в реализации, либо просто в вашем понимании. Вы не удаляете статическую часть.

4. Должно Dispose ли быть как всплывающее сообщение, так и удаление объекта?

5.Я бы предположил, что Dispose это метод «Pop», и поэтому не должно существовать общедоступного метода с именем «Pop», чтобы его нельзя было использовать неправильно.