Насколько я понимаю, using работает как 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);
}
Исключение генерируется 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
выбрасывает.
Однако, когда я следую шаблону using, очевидно, что метод 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
будет вести себя как попытка / улов. Может ли кто-нибудь объяснить, почему это происходит?
using
молча ест исключения? - person SLaks   schedule 06.03.2012using
имеет оператор catch, и до сих пор я никогда особо не думал об этом. Я всегда ловил исключения, и меня это никогда особо не волновало, но после прочтения статьи я понял, что чего-то не хватает. - person Kiril   schedule 06.03.2012