2014-07-19 55 views
-2

如果在下面的代碼的try塊中存在OutOfMemoryException,是否有可能讓is檢查自己拋出另一個OutOfMemoryException?換句話說,is檢查分配內存?OutOfMemoryException異常處理程序內是否可以使用is運算符會導致另一個OutOfMemoryException?

public void Main() 
    { 
     try 
     { 
      Execute(); 
     }    
     catch (Exception e) 
     { 
      if (e is OutOfMemoryException || e is ThreadAbortException) 
      { 
       throw; 
      } 
      else 
      { 
       Log(e); 
       throw; 
      } 
     } 
    } 
+0

還挺瑣碎只是試試這個,是不是?使用[這樣的代碼](http://referencesource.microsoft.com/#mscorlib/system/runtime/versioning/multitargetinghelpers.cs#65)。 –

+0

如果我嘗試它,它不會拋出異常,但我不確定這是否意味着它與下面的John Saunders解決方案相同。 –

+0

我從.NET框架(如鏈接的框架)中的用法中提取了問題中的代碼。在我看來,如果需要爲'is'分配內存,可能會出現另一個OOM異常,但這是使用.NET庫代碼的,據推測這很可靠。我對CLR內存分配知之甚少,所以我想知道這與John Saunders的代碼中的代碼是否相同。因此,這個問題。 –

回答

2

而不是你的代碼,請嘗試以下操作:

public void Main() 
{ 
    try 
    { 
     Execute(); 
    } 
    catch (OutOfMemoryException) 
    { 
     throw; 
    } 
    catch (ThreadAbortException) 
    { 
     throw; 
    } 
    catch (Exception e) 
    { 
     Log(e); 
     throw; 
    } 
} 
+0

你是說這永遠不會拋出第二個OOM異常? catch塊中的代碼沒有執行「is」檢查,但CLR必須在您的示例中的封面下執行相同的檢查。 CLR是否以與使用'is'運算符不同的方式來執行? –

+0

我沒有理由相信任何一個人都會執行任何重要的內存分配,但正如之前所說:如果內存緊張,那麼很多事情都會失敗。 .NET不是一個實時系統,你不能保證哪些操作將會或不會分配內存。 –

相關問題