我正在尝试检测我班级中的Sub New()是否由于缺少字段而提前结束。以下是我的代码示例:
Class Account
Public Sub New(ByVal Firstname As String, ByVal LastName As String, ByVal Username As String, ByVal Email As String, ByVal Password As String)
' Check For Blank Fields
If Firstname = "" Or LastName = "" Or Username = "" Or Email = "" Or Password = "" Then
MessageBox.Show("Please Enter All Information Requested")
Exit Sub
End If
' Set Public Variables Of Class
Firstname = Firstname
LastName = LastName
Username = Username
Email = Email
Password = Password
End Sub
Public Shared Sub OtherUse()
End Sub
End Class
' Create New Instance
Dim Process As New Account(txtFirstName.Text, txtLastName.Text, txtUsername.Text, txtEmail.Text, txtPassword.Text)
' HERE - How Can I Catch The Early Exit From The Instance Due To Potential Missing Fields?
' Use Instance For Other Use
Process.OtherUse()
如何从父表单中的类中捕获Exit Sub以防止进一步处理Process.OtherUse()?
答案 0 :(得分:4)
你正在以错误的方式解决这个问题。首先验证输入,然后在输入有效后,使用New
创建一个新帐户。
另一种选择是在New中初始化数据而不检查它是否有效,然后在该类中有一个IsValid
方法,你可以从另一个类调用它来知道是否应该显示消息框。
以这种或那种方式,Account类不应该像在屏幕上显示MessageBox一样关注UI问题。构造函数应该只负责构造对象,而不是验证输入,因为你不能“中止”构造函数。即使您拨打Exit Sub
,也可以引用新对象。
答案 1 :(得分:1)
第四种选择,除了Meta-Knight提到的三种选择之外:
当参数无效时,让构造函数抛出异常。
另外,在工作时使用Or
是一个逻辑错误:And
和Or
是按位算术操作。您需要一个逻辑操作,OrElse
(还有AndAlso
)。这些似乎与Or
和And
类似,在这种特殊情况下,两者都恰好起作用。但它们在语义上实际上是完全不同的,按位操作在这里是错误的(很可惜这个代码甚至编译。编译器不应该允许这样做。)