是try catch所必需的return语句

时间:2014-03-10 17:50:39

标签: vb.net return try-catch

我在一些电子邮件发送逻辑周围放了一个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

3 个答案:

答案 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的计时器而不是连续运行。工作得很好。