如何测试函数 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
首先,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