2014-07-19 32 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不是一个实时系统,你不能保证哪些操作将会或不会分配内存。 –

相关问题