PDA

View Full Version : [VB 2010] - Problema con function


lucausa75
18-12-2010, 13:07
Salve ragazzi,

come ben sapete sono ormai passato da tempo a VB Net e sto avendo qualche problema nella creazione di questa Function:

Public Function CheckIfFtpFileContains(ByVal path As String, ByVal SearchStr As String) As Boolean

If (path = Nothing Or path = "") Then
path = "/"
End If

_FtpRequest = CType(WebRequest.Create("ftp://" + _Host + path), FtpWebRequest)
_FtpRequest.Credentials = New NetworkCredential(_UserName, _Password)
_FtpRequest.UsePassive = False
_FtpRequest.Method = WebRequestMethods.Ftp.ListDirectoryDetails
_FtpRequest.EnableSsl = _UseSSL
_FtpRequest.Proxy = Nothing
_FtpResponse = CType(_FtpRequest.GetResponse(), FtpWebResponse)

Dim sr As New IO.StreamReader(_FtpRequest.GetResponse().GetResponseStream())
Dim str As String = sr.ReadLine()
While Not str Is Nothing
If Not str.StartsWith(".") Then
CheckIfFtpFileContains = IIf(InStr(str, SearchStr) > 0, True, False)
If CheckIfFtpFileContains = True Then
MessageBox.Show("Trovato")
Exit While
End If

End If
str = sr.ReadLine()
End While
sr.Close()
sr.Dispose()
sr = Nothing
_FtpRequest = Nothing

'Return XXXXXXXXXXXXXXXXXXXXXXXXXXXX

End Function


che mi restituisce il seguente avviso:
http://img585.imageshack.us/img585/9572/18122010140504.th.png (http://img585.imageshack.us/i/18122010140504.png/)

Come risolvo?

Grazie

jackk87
18-12-2010, 14:22
Guardando il codice posso capire se ftp contiene file allora ti restituisce true mentre se non ci sono ti deve restituire falso giusto?

Cmq tornando all'errore in pratica tu non dai nessun valore di ritorno alla funzione quindi io lo modificherei così:


Public Function CheckIfFtpFileContains(ByVal path As String, ByVal SearchStr As String) As Boolean

Dim Trovato as boolean = False

If (path = Nothing Or path = "") Then
path = "/"
End If

_FtpRequest = CType(WebRequest.Create("ftp://" + _Host + path), FtpWebRequest)
_FtpRequest.Credentials = New NetworkCredential(_UserName, _Password)
_FtpRequest.UsePassive = False
_FtpRequest.Method = WebRequestMethods.Ftp.ListDirectoryDetails
_FtpRequest.EnableSsl = _UseSSL
_FtpRequest.Proxy = Nothing
_FtpResponse = CType(_FtpRequest.GetResponse(), FtpWebResponse)

Dim sr As New IO.StreamReader(_FtpRequest.GetResponse().GetResponseStream())
Dim str As String = sr.ReadLine()
While Not str Is Nothing
If Not str.StartsWith(".") Then
CheckIfFtpFileContains = IIf(InStr(str, SearchStr) > 0, True, False)
If CheckIfFtpFileContains = True Then
Trovato =true
MessageBox.Show("Trovato")
Exit While
End If

End If
str = sr.ReadLine()
End While
sr.Close()
sr.Dispose()
sr = Nothing
_FtpRequest = Nothing

Return Trovato

End Function

MarcoGG
18-12-2010, 14:48
Aggiungo una considerazione su quel tipo di errore : da notare quel "on all code paths".
Una Function deve garantire sempre la restituzione del valore o oggetto previsto, in tutti i possibili percorsi del codice, perciò non è sufficiente piazzare un "Return" prima dell'End Function, per cavarsela. ;)

Ad esempio :
Public Function metodo(ByVal arg As Integer) As String

Select Case arg

Case 1
Return "Uno"

Case 2
Return "Due"

Case Else

End Select

End Function

Non va, perchè esiste almeno un percorso ( Case Else ) in cui non viene restituito nulla.

Questo fatto può sembrare banale, all'apparenza, ma nella pratica non lo è affatto. Possono esserci "percorsi" del codice nascosti, basti pensare alle istruzioni che possono sollevare eccezioni.
In un metodo "a regola d'arte" bisognerebbe prevedere ogni errore possibile e separare il codice in modo che ciascuna istruzione critica, in caso di errore ( Try Catch ) vada a restituire un valore o oggetto opportuno, ma in nessun caso deve bloccare l'esecuzione... ;)

jackk87
18-12-2010, 15:20
Aggiungo una considerazione su quel tipo di errore : da notare quel "on all code paths".
Una Function deve garantire sempre la restituzione del valore o oggetto previsto, in tutti i possibili percorsi del codice, perciò non è sufficiente piazzare un "Return" prima dell'End Function, per cavarsela. ;)

Ad esempio :
Public Function metodo(ByVal arg As Integer) As String

Select Case arg

Case 1
Return "Uno"

Case 2
Return "Due"

Case Else

End Select

End Function

Non va, perchè esiste almeno un percorso ( Case Else ) in cui non viene restituito nulla.

Questo fatto può sembrare banale, all'apparenza, ma nella pratica non lo è affatto. Possono esserci "percorsi" del codice nascosti, basti pensare alle istruzioni che possono sollevare eccezioni.
In un metodo "a regola d'arte" bisognerebbe prevedere ogni errore possibile e separare il codice in modo che ciascuna istruzione critica, in caso di errore ( Try Catch ) vada a restituire un valore o oggetto opportuno, ma in nessun caso deve bloccare l'esecuzione... ;)

Ottima osservazione :)

lucausa75
18-12-2010, 15:20
Grazie 1000 ad entrambe;
alla fine ho cmq risolto applicando in anticipo la soluzione suggerita da jackk87

:D