你是在正确的道路上,但你应该下定决心要获得什么:
如果你想开发一种方法来告诉你文件的内容是否被认为是 .Net 识别的图片,你的方法完全没问题。
我从你的(稍微)过度工作的代码开始:
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
不要将这种方法误判为使用Exception 进行控制流,如果文件的内容不可用于创建图像,您只会对抛出的方法做出反应。这让我们在框架上决定文件是否对Image有效。
让我们稍微改进一下你的方法,这样你就可以确定文件中的图像是否不超过给定的大小:
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
这也不是滥用Exceptions。这是快速失败的一种做法:如果我无法获得Image,则该文件不是Image。否则,我会检查打开的 Image 上的尺寸,使我的结果取决于使用它完成的操作。
将Exception 用于控制流可能,但不得如下:
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
如果您认为文件不是Image 是错误的,那么即使这种方法也有效。
但通常你会在给你Image作为返回值的函数中这样做。
但这完全是不行:
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,对不起,但我再也听不到这个 Exception 使用是一个糟糕的实践故事了。