私が理解している限り、try/catch/finallyのようなものを使用すると、例外を使用するステートメントで発生した場合、それは捕まえられることが予想されます(これはちょっと奇妙です。静かに食べた)。 usingステートメントは例外をキャッチし、Dispose
メソッドを呼び出す必要がありますが、それは起こっていません。私はこの問題を実証するための簡単なテストを考案しました。私が使用して文の内部で発生した例外を強制するのはここtry/catch/finallyのように動作すると思われる場合、なぜ例外をスローしますか?
は次のとおりです。
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()
で投げています:Dispose
メソッドがスローした場合
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メソッドがスローしないことは明らかである:
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
を期待していたので、私は、少し混乱しています/キャッチ。誰がなぜこれが起こっているのか説明できますか?使用
を失敗した場合、ApplicationExceptionをを使用してブロックの外に見たことがないが、最終的にブロックして、最終的にはキャッチしないでください。例外は、依然としてusingブロックから捨てられます。 –
なぜ_what_が起きていますか?あなたは 'using'ステートメントが静かに例外を食べると期待していますか? – SLaks
何らかの理由で私は「使用する」にcatchステートメントがあるという印象が残っていましたが、今までそれについてあまり考えすぎたことはありませんでした。私はいつも例外をキャッチし、それは本当に私を心配することはありませんでしたが、記事を読んだ後、私は何かが不足していることに気付きました。 – Kiril