48

using は例外をキャッチしますか、それともスローしますか? すなわち

using (StreamReader rdr = File.OpenText("file.txt"))
{
 //do stuff
}

ストリームリーダーが例外をスローした場合、呼び出し元の関数がそれを処理できるように、使用またはスローによってキャッチされますか?

4

11 に答える 11

64

using ステートメントが表示されたら、次のコードを考えてみてください。

StreadReader rdr = null;
try
{
    rdr = File.OpenText("file.txt");
    //do stuff
}
finally
{
    if (rdr != null)
        rdr.Dispose();
}

したがって、本当の答えは、using ブロックの本体で例外がスローされても何もしないということです。それを処理したり、再スローしたりしません。

于 2008-09-29T17:00:17.617 に答える
35

using ステートメントは例外を食べません。

「Using」が行うことはすべて、オブジェクトを using ブロックにスコープし、オブジェクトがブロックを離れるときに Dispose() を自動的に呼び出すことです。

ただし、スレッドが外部ソースによって強制的に中止された場合、Dispose が呼び出されない可能性があります。

于 2008-09-29T16:58:43.423 に答える
16

using例外が沸騰することを許可します。これは、最終的に使用されたオブジェクトを破棄する try/finally のように機能します。したがって、実装するオブジェクトにのみ適切/有用ですIDisposable

于 2008-09-29T16:57:44.860 に答える
6

例外がスローされるため、含まれているメソッドで例外を処理するか、スタックに渡す必要があります。

try
{
    using (
        StreamReader rdr = File.OpenText("file.txt"))
    { //do stuff 
    }
}
catch (FileNotFoundException Ex)
{
    // The file didn't exist
}
catch (AccessViolationException Ex)
{
    // You don't have the permission to open this
}
catch (Exception Ex)
{
    // Something happened! 
}
于 2008-09-29T17:01:17.677 に答える
4

using ステートメントの初期化式でスローされた例外はすべて、メソッド スコープとコール スタックを想定どおりに伝播します。

ただし、注意すべきことの 1 つは、初期化式で例外が発生した場合、式変数で Dispose() メソッドが呼び出されないことです。これは、実際には作成されていないオブジェクトをわざわざ破棄したくないため、ほとんどの場合、必要な動作です。ただし、複雑な状況では問題が発生する可能性があります。つまり、複数の初期化がコンストラクター内に埋め込まれていて、例外がスローされる前に一部が成功した場合、その時点で Dispose 呼び出しが発生しない可能性があります。ただし、コンストラクターは通常単純に保たれているため、これは通常は問題になりません。

于 2008-09-29T17:05:25.187 に答える
3

あなたの例では、File.OpenTextスローされた場合、 は呼び出されDisposeませ

で例外が発生した場合、//do stuffDispose 呼び出されます。

どちらの場合も、 usingステートメントがない場合と同様に、通常、例外はスコープ外に伝播されます。

于 2011-05-04T03:58:51.783 に答える
2

例外を明確にキャッチしない場合、何かが発生するまでスタックにスローされます

于 2008-09-29T16:57:19.230 に答える
2

using は、そのスコープ内のものをクリーンアップすることを除けば、例外処理に干渉しません。

例外を処理しませんが、例外を通過させます。

于 2008-09-29T16:58:49.960 に答える
2

using例外がスローされた場合でも、作成されたオブジェクトがブロックの最後に破棄されることを保証します。例外はキャッチされません。ただし、自分で捕まえようとする場合は注意が必要です。例外をキャッチするコードは、ステートメントで定義されたスコープ ブロックの外側にあるため、usingそのコードではオブジェクトを使用できません。

*停電、核のホロコーストなどの通常の容疑者を除いて

于 2008-09-29T17:02:07.313 に答える
1

catch ブロックなしでtry...finallyブロックとして使用することを想像できます。finally ブロックでは、IDisposable.Dispose が呼び出され、catch ブロックがないため、すべての例外がスタックにスローされます。

于 2008-09-29T17:03:49.120 に答える
0

「使用」は例外をキャッチしません。未処理の例外が発生した場合にリソースを破棄するだけです。

おそらく問題は、宣言でもエラーが発生した場合、括弧内に割り当てられたリソースを破棄するかどうかです。ただし、両方が起こるとは想像しがたいです。

于 2008-09-29T16:59:40.597 に答える