2008-09-25 26 views
5

Estoy llamando a algún código que utiliza la clase BitmapData de .NET. He golpeado algo donde no puedo encontrar una respuesta definitiva en Googlespace.unlockbits, lockbits, y try-finally

Porque parece que LockBits y UnLockBits siempre deben ser llamados en un par, estoy usando esto:

  System.Drawing.Imaging.BitmapData tempImageData = tempImage.LockBits(
      new System.Drawing.Rectangle(0, 0, tempImage.Width, tempImage.Height), 
      System.Drawing.Imaging.ImageLockMode.ReadOnly, tempImage.PixelFormat); 
     try 
     { 
      //use external library on the data 
     }//Exception not handled here; throw to calling method 
     finally 
     { 
      tempImage.UnlockBits(tempImageData); 
     } 

(Hace poco he estado jugando con la instrucción using, que es muy útil en C#, lo que me dio la idea de que debería hacer esto.) El problema es que, incluso la propia documentación de MS (http://msdn.microsoft.com/en-us/library/system.drawing.bitmap.unlockbits.aspx) no cree que sea adecuado utilizar el patrón try-finally.

¿Es finalmente necesario o gratuito?

Actualización: Puedo terminar atrapando y volviendo a lanzar la excepción, ya que no sé lo que podría ser y no los estaba detectando antes.

Gracias!

Respuesta

7

El patrón try-finally es correcto. Como se trata de un código externo, no tiene control sobre las excepciones que se lanzan, y el código de limpieza UnlockBits debe ejecutarse independientemente de qué error haya ocurrido.

0

¿Espera que se produzca algún tipo de excepción? Si lo eres, ¿puedes atraparlo? Si no, entonces no veo el sentido de la prueba/finalmente.

También hay filosofías diferentes sobre excepciones. Personalmente, pienso en ellos como "excepcionales", como que se cortó la electricidad cuando se realizó la última escritura de archivo, por lo que su archivo serializado es más corto de lo que esperaba. No estoy seguro de qué tipo de situación excepcional puede ocurrir cuando manipulas bits como este. Si te sales del final de la matriz, eso no es excepcional, eso solo significa que debes ajustar la verificación de tus límites.

+0

Un buen punto, aquí. El código no es nuestro; pertenece a una biblioteca propietaria con la que trabajamos. – Chris

1

Incluso si capta la excepción, usar finalmente significa que no duplica la llamada UnlockBits, que es una ventaja en mi opción.

Cuestiones relacionadas