我在一些电子邮件发送逻辑周围放了一个try / catch块。如果电子邮件成功,则会发出确认消息,如果失败,则会显示失败消息。 Visual Studio警告我该函数不会在所有代码路径上返回值。我是否需要在每个Try和Catch块中放置return语句?如果我这样做,例如在Try and Catch结束时将Return语句设置为False或Null,那么Return语句之前的其他代码是否仍会执行?
Function Sendmail(ByVal subject As String, ByVal msg As String, ByVal fromAddress As String, ByVal toAddress As String)
Try
Dim message As New MailMessage
message.From = New MailAddress(fromAddress)
For Each s As String In toAddress.Split(New [Char]() {";"c})
message.To.Add(New MailAddress(s))
Next
message.Subject = subject
message.Body = msg
message.IsBodyHtml = False
Dim client As New SmtpClient
client.Send(message)
pnlEmailSuccess.Visible = True
Catch ex As Exception
pnlEmailSuccess.Visible = False
pnlEmailError.Visible = True
lblErrorMsg.Text = ex.ToString
End Try
End Function
答案 0 :(得分:4)
要回答您的问题,请不要在return
中使用Try/Catch
语句。如果您没有返回值,则无需在函数中编写它。您可以在sub
语句或sub
过程中编写它,而不是在函数中编写它。这是一个link,可以了解有关sub
程序的更多信息。
答案 1 :(得分:2)
VB.NET期望函数中执行的最后一个语句是一个Return,它将一个值发送回调用过程。当代码遇到Return语句时,它会立即终止代码的执行并返回指定的值,这就是为什么它通常是函数中的最后一个语句(例如见下文)。 VB.NET只是警告你有可能(在你的情况下,确定,因为该函数只有一个退出点)该函数不会返回一个值。作为可能发生这种情况的另一个例子,考虑一个具有两个不同路径的函数,代码可以通过这两个路径退出:
Function IsThisFive(ByVal x as Integer) as Boolean
If x = 5 Then
Return True 'One code path exits here, with return value
Else
MsgBox("This is not five!")
End If
' Other code path exits here if x <> 5 -- no return value specified
End Function
要回答您的问题,不,您在Try和Catch块中都不需要返回值。但是,在End Try之后和End Function之前,你需要一个。代码将通过Try..Catch..End Try构建,然后返回一个值。
如果你不需要它来返回一个值,为什么不把它变成一个子而不是一个函数呢?预计sub不会返回值,从而消除了问题。 : - )
如果您仍然希望它是一个函数,编程中的一个常见约定是只有一个子例程或函数的退出点。这使得在调试或读取代码时更容易遵循程序流程。
你可以这样做:
Function SendMail(ByVal subject As String, ByVal msg As String, ByVal fromAddress As String, ByVal toAddress As String) as Boolean
Dim maiLSent as Boolean = False
Try
'send mail code
mailSent = True
Catch
'exception handling code here
mailSent = False
End Try
Return mailSent ' Only exit point from function is here
End Function
答案 2 :(得分:1)
我将它添加到使用Try-Catch的计时器而不是连续运行。工作得很好。