2009-05-21 7 views
4

例外がスローか遭遇した:例外とメモリ

void ThrowException() 
{ 
    try 
    { 
     throw new Exception("Error"); 
    } 
    catch 
    { 
    } 
} 

は、それがメモリから配置されているか&のですか?

上記のコードはExceptionオブジェクトのメモリからの廃棄に関して次のコードとどう違うのですか?

void ThrowException() 
{ 
    try 
    { 
     throw new Exception("Error"); 
    } 
    catch(Exception e) 
    { 
    } 
} 
+0

私は2番目の警告で嘆いていますが、catch(Exception)と書くことができます。差はありません....なぜ例外を飲み込むのですか?キャッチハンドラやログを無視してスローします。それは – kenny

+0

@ケニー、私はそれが単なる例だと思う、彼はおそらくそこにいくつかの例外処理コードを持っているでしょう –

+0

@ケニー、うん、ネイサンはそうです、私は例外に何が起こるかを知りたい。 理由は私が使用していることです System.Net.Sockets.Socket with BlockingMode = false; Accept()メソッドを呼び出すと、System.Net.Sockets.SocketExceptionがスローされます。 私はこのAccept()メソッドを反復して、大量のSocketExceptionsを投げています。 何が行われるのか知りたかったのです! 問題を詳細に話す別の特定の質問を設定します。 – divinci

答えて

2

例外インスタンスは単にメモリ内の別のオブジェクトとして機能します。キャッチメソッドの後にインスタンスへの参照は残っていないので、次のガベージコレクションスイープで削除されます。

例外は通常、例外に関連付けられた外部リソースが存在しないため、IDisposableから継承しません。 の場合はです。 IDisposable例外がある場合は、あなたのアーキテクチャ&コードの設計が正しいかどうか本当に難しいでしょう。

7

例外はIDisposableから継承されないため、廃棄する必要はありません。 メモリの割り当て解除は、すべての.NETオブジェクトと同様にGCによって行われます。

1

Exceptionクラスは、それへの参照がなくなり、最終的にガベージコレクタがターンアラウンドするときにガベージコレクションされます。例外オブジェクトは、ヒープ上に割り当てられた他のオブジェクトと同様に処理されます。

例外オブジェクトは上方にバブリングされるので、スタックの上にキャッチしたりスローしたりするメソッドがなくなった場合、例外オブジェクトは参照されなくなります。

どちらの例も例外を上げることはないため、どちらの例も同じ影響を与えます。どちらの例も、メソッドが戻るときに参照外になります。

1

例外はIDisposableを実装していないので、他のオブジェクトのようにガベージコレクタによって自動的に削除されるため、もう参照されないので、それらについて気にする必要はありません。

class CustomException : Exception { 
    ~CustomException() { 
     Console.WriteLine("Exception removed"); 
    } 
} 

class Program { 
    static void Throw() { 
     throw new CustomException(); 
    } 
    static void Main(string[] args) { 
     try { 
      Throw(); 
     } 
     catch { 

     } 
    } 
} 
+1

ダリオ: "例外はIDisposableを実装していないのでガベージコレクタによって自動的に削除されるので、IDisposableを実装するオブジェクトは自動的に収集されないという印象を与える可能性があります。 (おそらく)回収に時間がかかりますか?または、おそらく良い、IDisposableの言及を削除? –

+0

@BinaryWorrierなぜIDisposableを実装するオブジェクトを収集するのに時間がかかりますか? – LukeH

+1

ファイナライザがあるためです。 GC(理論上は)は、収集されるオブジェクトを、ファイナライザを持つものとないものの2つのリストに置きます。それを持たない人はすぐに収集することができ、それを持っている人はファイナライザをコールしてから収集する必要があります。これは、GC.SuppressFinalize(this)をDisposeメソッドに配置するのが良い習慣であるため、オブジェクトをより高速にGCすることができます。これが正確ではない場合は、私の仲間のパンツはコメントを追加して教えてください。ありがとう:) –