我有一个函数来检查传递URL后是否存在远程文件。假设它不存在,该函数将返回0以在另一个子中使用。这就是我所拥有的:
Public Function RemoteFileExists(ByVal fileurl As String) As Integer
Dim request As FtpWebRequest = DirectCast(WebRequest.Create(fileurl), FtpWebRequest)
request.Method = WebRequestMethods.Ftp.GetFileSize
Dim response As FtpWebResponse = DirectCast(request.GetResponse(), FtpWebResponse)
If response.StatusCode = FtpStatusCode.ActionNotTakenFileUnavailable Then
RemoteFileExists = 0
Exit Function
End If
Dim fileSize As Long = response.ContentLength
MsgBox(fileSize)
If fileSize > 0 Then
RemoteFileExists = 1
Else
RemoteFileExists = 0
End If
End Function
当我运行应用程序并故意提供不存在的URL时Visual Studio会给我System.Net.WebException未处理。消息=远程服务器返回错误:(550)文件不可用(例如,找不到文件,没有访问权限。)
我认为“if response.StatusCode ...”会处理而不是关闭程序。
任何帮助表示感谢。
DWM
答案 0 :(得分:1)
首先,您应该从Integer
切换到Boolean
,因为您无论如何都只返回1或0。 Boolean
可以是True或False。
其次,您应该将所有内容都包装在Try
/ Catch
块中,以处理可能发生的任何错误。在Try
/ Catch
中包装代码可以捕获大多数错误(除了最极端的错误)并将其置于可能引发错误的代码之外,可以避免您的应用程序因更简单的错误而崩溃。 / p>
最后,您应该使用Return <value>
而不是RemoteFileExists = <value>
,因为Return
都会返回所需的值并退出该函数。
示例实施:
Public Function RemoteFileExists(ByVal fileurl As String) As Boolean
Try
Dim request As FtpWebRequest = DirectCast(WebRequest.Create(fileurl), FtpWebRequest)
request.Method = WebRequestMethods.Ftp.GetFileSize
Dim response As FtpWebResponse = DirectCast(request.GetResponse(), FtpWebResponse)
If response.StatusCode = FtpStatusCode.ActionNotTakenFileUnavailable Then
Return False 'Return instead of Exit Function
End If
Dim fileSize As Long = response.ContentLength
MsgBox(fileSize)
If fileSize > 0 Then
Return True
Else
Return False
End If
Catch ex As Exception 'Catch all errors
'Log the error if you'd like, you can find the error message and location in "ex.Message" and "ex.StackTrace".
MessageBox.Show("An error occurred:" & Environment.NewLine & ex.Message & Environment.NewLine & ex.StackTrace, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
Return False 'Return False since the checking failed.
End Try
End Function
在Catch
块中,ex.Message
是错误消息,ex.StackTrace
是代码中发生错误的位置。