Compartir a través de


System.Drawing OutOfMemoryException cambió a ExternalException

El control de errores de GDI+ en System.Drawing se ha actualizado para iniciar ExternalException en lugar de OutOfMemoryException para Status.OutOfMemory errores.

Versión introducida

.NET 10

Comportamiento anterior

Anteriormente, cuando GDI+ encontró errores Status.OutOfMemory (a menudo debido a problemas de entrada no válidos en lugar de problemas reales de memoria), las APIs de System.Drawing generaron OutOfMemoryException.

Nuevo comportamiento

A partir de .NET 10, cuando GDI+ encuentra Status.OutOfMemory errores, las API de System.Drawing ahora inician ExternalException.

Tipo de cambio disruptivo

Se trata de un cambio de comportamiento.

Motivo del cambio

GDI+ no es especialmente bueno al devolver errores cuando no se pueden crear objetos internos. Hay muchos casos en los que se produce un error en la creación de objetos debido a una entrada no válida y el código de nivel superior obtiene un valor NULL y lo convierte en Status.OutOfMemory. Esto suele ser una fuente de confusión, ya que el error no suele estar relacionado con problemas de memoria reales.

El cambio a ExternalException proporciona informes de errores más precisos, ya que este tipo de excepción ya se produce en otras rutas de código System.Drawing para errores GDI+ similares.

Si el código detecta OutOfMemoryException al usar las API de System.Drawing, asegúrese de detectar ExternalException también para controlar estos errores de GDI+.

try
{
    // System.Drawing operations
}
catch (ExternalException ex)
{
    // Handle GDI+ errors (including former OutOfMemoryException cases)
}
catch (OutOfMemoryException ex)
{
    // Handle actual memory issues
}
Try
    ' System.Drawing operations
Catch ex As ExternalException
    ' Handle GDI+ errors (including former OutOfMemoryException cases)
Catch ex As OutOfMemoryException
    ' Handle actual memory issues
End Try

Las APIs afectadas

Todas las API de System.Drawing que interactúan con GDI+ y que anteriormente podían producir OutOfMemoryExceptionStatus.OutOfMemory errores, entre las que se incluyen, entre otras: