in common/src/service/Fx.cs [99:160]
public static bool IsFatal(Exception exception)
{
while (exception != null)
{
// FYI, CallbackException is-a FatalException
if (exception is FatalException || exception is OutOfMemoryException)
{
#if !NET451
return true;
#else
if (!(exception is InsufficientMemoryException))
{
return true;
}
#endif
}
#if NET451
if (exception is ThreadAbortException
|| exception is AccessViolationException
|| exception is SEHException)
{
return true;
}
#endif
if (exception is NullReferenceException)
{
return true;
}
// These exceptions aren't themselves fatal, but since the CLR uses them to wrap other exceptions,
// we want to check to see whether they've been used to wrap a fatal exception. If so, then they
// count as fatal.
if (exception is TypeInitializationException
|| exception is TargetInvocationException)
{
exception = exception.InnerException;
}
else if (exception is AggregateException)
{
// AggregateExceptions have a collection of inner exceptions, which may themselves be other
// wrapping exceptions (including nested AggregateExceptions). Recursively walk this
// hierarchy. The (singular) InnerException is included in the collection.
ReadOnlyCollection<Exception> innerExceptions = ((AggregateException)exception).InnerExceptions;
foreach (Exception innerException in innerExceptions)
{
if (IsFatal(innerException))
{
return true;
}
}
break;
}
else
{
break;
}
}
return false;
}