#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()
вручную, так как тогда вы никогда не вызывали Dispose2. Удаление не обязательно означает, что что-то непригодно для использования; завершение делает. Это
Ctx
класс, который вы контролируете? Если да, пожалуйста, опубликуйте его. Информация, которую он накапливает, может быть сохранена для вашего вызоваGetStack
, но нет способа узнать, не видя кода.3. На самом деле, вы объединили отдельные
IDisposable
экземпляры, которыеPush
возвращаются, со статической информацией, котораяCtx
поддерживается либо в реализации, либо просто в вашем понимании. Вы не удаляете статическую часть.4. Должно
Dispose
ли быть как всплывающее сообщение, так и удаление объекта?5.Я бы предположил, что
Dispose
это метод «Pop», и поэтому не должно существовать общедоступного метода с именем «Pop», чтобы его нельзя было использовать неправильно.