Мне кажется, я понимаю замешательство.Вот некоторый псевдокод (который может фактически выполняться?), Объясняющий ваш сценарий более просто:
public class Foo
{
public void DoStuff()
{
using (var x = new Thing())
{
throw new ApplicationException("This code breaks");
}
}
private class Thing : IDisposable
{
public override Dispose()
{
throw new ApplicationException("Help, I can't dispose!");
}
}
}
Этот код можно считать таким же, как этот код:
public class Foo
{
public void DoStuff()
{
var x = new Thing();
try
{
throw new ApplicationException("This code breaks");
x.Dispose();
}
catch (Exception err)
{
x.Dispose();
rethrow;
}
}
private class Thing : IDisposable
{
public override Dispose()
{
throw new ApplicationException("Help, I can't dispose!");
}
}
}
используя блок using
, вы, по сути, говорите: «Независимо от того, что вы делаете, выполните Dispose()
для этого объекта, прежде чем двигаться дальше».Тем не менее, блок using
не изящно обрабатывает случай, когда Dispose()
не удается.Из-за этого ему никогда не удастся выбросить внутреннее исключение, потому что было еще одно исключение, которое опередило его, даже если это произошло позже.
Имеет ли это смысл?Я даже ответил на ваш вопрос?Я не уверен, если вам нужна помощь в понимании этого или чего.