Насколько я понимаю, использование работает как try / catch / finally, поэтому я ожидаю, что если в операторе using возникнет исключение, оно будет перехвачено (что довольно странно, поскольку это также означает, что исключениемолча едят).Оператор using должен перехватить исключение и вызвать метод Dispose
, однако этого не происходит.Я разработал простой тест для демонстрации проблемы.
Вот где я вынуждаю исключение внутри оператора using:
using (TcpClient client = new TcpClient())
{
// Why does this throw when the using statement is supposed to be a try/catch/finally?
client.Connect(null);
}
Исключение - throw by client.Connect()
(это означает, что он не был перехвачен оператором using или что он был переброшен):
System.ArgumentNullException: Value cannot be null.
Parameter name: remoteEP
at System.Net.Sockets.TcpClient.Connect(IPEndPoint remoteEP)
at DotNETSandbox.Program.Main(String[] args) in C:\path\to\Sandbox\Program.cs:line 42
Согласно статье Microsoft по теме , оператор using может выдать, еслиDispose
метод throws.
Однако, когда я следую шаблону использования, становится очевидным, что метод Dispose не выбрасывает:
TcpClient c2 = new TcpClient();
try
{
c2.Connect(null);
}
catch (Exception e)
{
// We caught the null ref exception
try
{
// Try to dispose: works fine, does not throw!
((IDisposable)c2).Dispose();
}
catch (Exception e2)
{
Console.WriteLine(e2.ToString());
}
Console.WriteLine(e.ToString());
}
Я немного растерялся,так как я ожидал, что using
будет вести себя как попытка / уловКто-нибудь может объяснить, почему это происходит?