如何测试函数是否返回成功创建的对象?

时间:2015-01-09 13:21:07

标签: vb.net excel

首先,CreateApp()调用NewAppSheet()。

其次,NewAppSheet()返回一个对象。

第三,CreateApp()测试对象创建是否成功。

我经常发现自己处于这种状况。这种情况的好习惯是什么?在这种情况下有什么细微差别(例如:如果对象从未成功创建或者它只是指向什么都没有问题吗?)?

以下代码是我对优雅的最佳尝试。不幸的是,CreateApp()中的'Else'永远不会发生,所以我的测试不起作用。

   Sub CreateApp()

        Dim wks As Excel.Worksheet = NewAppSheet()
        If Not wks Is Nothing Then
            WriteAppText(wks)
        Else
            MessageBox.Show("This never happens")
        End If

    End Sub

    Function NewAppSheet() As Excel.Worksheet
        Dim sMessage As String = "Message"
        Dim sTitle As String = "Title"
        Dim sDefaultValue As String = ""
        Dim sValue As String
        Dim wks As Excel.Worksheet

        ' Display message, title, and default value
        sValue = InputBox(sMessage, sTitle, sDefaultValue)

        wks = CType(AddinModule.CurrentInstance, TimeTracker.AddinModule).ExcelApp.ActiveWorkbook.Worksheets.Add()

        Try
            wks.Name = sValue
        Catch
            wks.Delete()
            MessageBox.Show("A worksheet with that name already exists. Please type a different name next time.")
        End Try

        NewAppSheet = wks

    End Function

我知道我可以创建一个名为bSuccessful的额外变量,并在我的测试中使用它。但我认为必须有一个更好的程序员使用的更好的练习,所以我问你们好吗?

2 个答案:

答案 0 :(得分:2)

您永远不会收到Else声明,因为NewAppSheet永远不会返回Nothing

Try
    wks.Name = sValue
Catch
    ' This will delete the sheet.
    ' It will NOT set wks to Nothing.
    wks.Delete()
    MessageBox.Show("A worksheet with that name already exists. Please type a different name next time.")
    ' Explicitly set wks object to nothing.
    wks = Nothing
End Try

' Use Return instead of assigning to the function name.
Return wks

如上面的代码片段所示,通常最好在VB.NET函数中使用Return,而不是将值赋给函数名称(例如NewAppSheet = wks),这是怎么回事在VBA完成。

因为您也在征求反馈意见:程序方面,您的代码和方法对我来说很好。很清楚代码的意图是什么,我觉得很容易理解。

答案 1 :(得分:2)

让NewAppSheet从Catch块返回Nothing。

    Try
        wks.Name = sValue
    Catch
        wks.Delete()
        MessageBox.Show("A worksheet with that name already exists. Please type a different name next time.")
        Return Nothing
    End Try