據我所知,使用像try/catch/finally這樣的工程,所以我期望如果在using語句中發生異常,它會被捕獲(這有點奇怪,因爲那也意味着異常是默默吃了)。 using語句應該捕獲異常並調用Dispose
方法,但是,這種情況不會發生。我已經設計了一個簡單的測試來演示這個問題。爲什麼在應該像try/catch/finally那樣運行時拋出異常?
這裏是我強迫異常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()
(這意味着它沒有被使用的語句或捕獲,它正在重新拋出) :
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
據a Microsoft article on the topic,using語句可能如果Dispose
方法拋出拋出。
然而,當我正在關注的使用模式,顯而易見的是,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
表現得像一試/抓住。有誰能解釋爲什麼會發生這種情況嗎?
,終於阻止,終於不是試試抓住。異常仍會拋出使用塊。 – 2012-03-06 19:44:26
爲什麼_what_發生?你是否期望'using'語句默默地吃掉異常? – SLaks 2012-03-06 19:45:40
@SLaks由於某種原因,我留下的印象是「使用」有一個聲明,我從來沒有真正投入過多的想法,直到現在。我總是抓住例外,它從來沒有真正擔心過我,但在閱讀文章後,我意識到我錯過了一些東西。 – Kiril 2012-03-06 19:56:33