如何测试函数 returns 是否已成功创建对象?

How can I test if function returns a successfully created object?

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

二、NewAppSheet()returns一个对象。

三、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 的额外变量并在我的测试中使用它。但我认为必须有更好的程序员使用的更好的做法,所以我问你们?

你从来没有达到你的 Else 语句,因为 NewAppSheet 从来没有 returns 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.

中的做法

由于您也在征求反馈意见:在程序方面,您的代码和方法对我来说很好。代码的意图很清楚,我发现它很容易理解。

只有 NewAppSheet return Catch 块中没有任何内容。

    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