2009-05-21 56 views
4

當一個異常被拋出或遇到:異常和內存

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

是&它是如何從內存配置?

以上代碼與下面的代碼在處理Exception對象的內存方面有什麼不同?

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

我會畏懼第二個的警告,但你可以寫catch(Exception)。沒有差異....買爲什麼吞下異常?我要麼忽略捕獲處理程序,要麼登錄並拋出;它 – kenny 2009-05-21 12:47:30

+0

@ Kenny,我認爲這只是一個例子,他可能會有一些異常處理代碼 – 2009-05-21 13:18:31

回答

2

Exception實例只是作爲內存中的另一個對象 - 在catch方法之後,沒有任何剩餘的實例引用,所以它將在下一次垃圾收集掃描中被刪除。

異常通常不會從IDisposable繼承,因爲實際上不應該有與異常關聯的外部資源。如果你。有一個IDisposable例外,你應該看看你的架構&代碼設計是否正確。

7

異常不會從IDisposable繼承,因此它不需要處置。 內存釋放由GC完成,就像所有.NET對象一樣。

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 { 

     } 
    } 
}