Después de de esta larga recopilación de datos hemos podido resolver este rompecabezas que suelen tener ciertos usuarios. Te regalamos la solución y nuestro deseo es resultarte de mucha apoyo.
Solución:
He visto System.Drawing arrojar OutOfMemoryExceptions incluso cuando no se ha quedado sin memoria. Aparentemente, algunas funciones de GDI+ solo devuelven un código de error estúpido.
IIRC, obtendrá una excepción OutOfMemoryException si intenta usar un LinearGradientBrush para llenar un rectángulo cuyo ancho o alto es cero. Puede haber otras condiciones también, pero esta es la principal con la que nos encontramos.
En ese caso, no hay necesidad de probar/atrapar. Solo agrega un if
declaración a su código de dibujo, y no llene el rectángulo si el ancho o la altura es cero.
Actualización: según los comentarios sobre esta respuesta, también puede ocurrir si intenta cargar un archivo de imagen dañado. Para eso, no tendría más remedio que intentar/atrapar.
Probablemente esté seguro de capturar OutOfMemoryExceptions de GDI+, pero mantenga los bloques de prueba lo más pequeños posible. Considere registrar las excepciones, para que pueda analizar los registros y agregar código defensivo cuando sea posible. No quieres enmascarar un verdadero OutOfMemoryException, pero tampoco desea que un estúpido código de error GDI+ bloquee su aplicación.
Es una excepción bastante mala: http://msdn.microsoft.com/en-us/library/system.outofmemoryexception.aspx .. no hay suficiente memoria para continuar la ejecución del programa.
A menudo encontrará que si ha asignado tanto que las operaciones/asignaciones ‘simples’ arrojan este mensaje, la aplicación se bloqueará poco después. Si lo que está fallando es una asignación masiva, es posible que pueda continuar.
Si la aplicación hace algo importante, debe intentar cerrar las cosas con gracia.
Para responder explícitamente a sus preguntas:
-
Se lanzan para que la aplicación tenga la oportunidad de reaccionar/recuperarse: se puede esperar que algunas asignaciones de memoria (10 GB de objetos) fallen en muchas situaciones, tal vez un bloqueo de la aplicación de una línea (
int[] x = new int[5368709120];
equivalente) realmente debería lanzar una excepción en lugar de bloquear todo -
No debería haber ningún efecto oculto, pero si una asignación falla, quizás la próxima vez que desee una
string
u otro objeto útil asignado de alguna manera pequeña para el funcionamiento general de la aplicación: las cosas pueden volverse inestables. Dicho esto, dependiendo del entorno, es posible que obtenga esta excepción en cualquier momento.
Editar: cualquiera que lea esto también debería considerar que aparentemente GDI+ lanza esta excepción también por otras razones.
valoraciones y reseñas
Puedes reafirmar nuestra labor poniendo un comentario y dejando una puntuación te damos la bienvenida.