You are on the right way, but you should make up your mind what you want to whant to gain:
If you want to develop a method telling you wheter the content of a file is considered a .Net recognized picture image, your approach is totally fine.
I start with your (slightly) overworked code:
Function IsValidImage(filename As String) As Boolean
Try
Using img As System.Drawing.Image = System.Drawing.Image.FromFile(filename)
' the file could be opened as image so it is valid
Return True
End Using
Catch notValidException As OutOfMemoryException
' Image.FromFile throws an OutOfMemoryException
' if the file does not have a valid image format or
' GDI+ does not support the pixel format of the file.
'
Return False
End Try
' Every other Exception is considered not to be able too look whether the
' file is an Image or not, so it should be thrown to outside
End Function
Don't misjudge this approach as using Exception
for control flow, you are only reacting to the one thrown if the content of the file is not usable for creating an Image. This let's the decision on the framework whether the file is valid for an Image
or not.
Let's refine your Method a little bit, so that you can determine wheter the image in the file does not exceed a given size:
Function IsValidImage(filename As String, maxSize As Size) As Boolean
Try
Using img As System.Drawing.Image = System.Drawing.Image.FromFile(filename)
' Returns True if the image is smaller or equal than maxSize
Return img.Size.Width <= maxSize.Width AndAlso
img.Size.Height <= maxSize.Height
End Using
Catch notValidException As OutOfMemoryException
Return False
End Try
End Function
Also this is not a misuse of Exceptions
. It is a practice of fail fast: if I can't get an Image
the file is not an Image
. Otherwise I check the dimension on the opened Image
, making my outcome dependent on operations done with it.
Misusing an Exception
for control flow could, but must not be the following:
Sub CheckImage(filename As String)
Try
Using img As System.Drawing.Image = System.Drawing.Image.FromFile(filename)
End Using
Catch notValidException As OutOfMemoryException
Throw New FileIsNoImageException()
End Try
End Sub
Try
CheckImage("c:\path\to\your\file.ext")
'do something
'
Catch invalid As FileIsNoImageException
'do something else
'
End Try
Even this approach has a valid usage if you consider a file not beeing an Image
as an error.
But normaly you would do this in functions which give you the Image
as return value.
But this is a tottaly no go:
Sub CheckImage(filename As String)
Try
Using img As System.Drawing.Image = System.Drawing.Image.FromFile(filename)
Throw New FileIsImageException() ' DON'T DO SUCH A CRAP
End Using
Catch notValidException As OutOfMemoryException
Throw New FileIsNoImageException()
End Try
End Sub
Try
CheckImage("c:\path\to\your\file.ext")
Catch valid As FileIsImageException
'do something
'
Catch invalid As FileIsNoImageException
'do something else
'
End Try
@Tim, I beg your pardon, but I can't hear this Exception
use is a bad practice tale any more.