好吧,我有一个功能,比如
Public Function test() As DateTime
Dim Result As DateTime = Date.Now
Try
' this file is nonexistent, so it will crash
IO.File.Open("C:/asdasd.txt", IO.FileMode.Open)
Catch
Return False
End Try
Return Result
End Function
当然,它会导致错误,说不允许返回一种类型的布尔值。
我的问题是,当函数遇到Try-Catch
语句中的错误时,是否可以返回不同的数据类型?比如说,发生错误时返回一个布尔值或字符串?
答案 0 :(得分:1)
你应该只在发生了你没想到或无法预料到的事情时抛出异常。您可以预期该文件可能不存在,因此请检查该文件。
考虑像这样重写你的功能。使用布尔返回值指示方法是成功还是失败,以及ByRef日期值:
Public Function ReadValueFromFile(ByRef value As DateTime) As Boolean
Try
Dim filename As String = "C:/asdasd.txt"
'just return false if the file does not exist
If Not My.Computer.FileSystem.FileExists(filename) Then Return False
'if the file exists then return the current time
IO.File.Open("C:/asdasd.txt", IO.FileMode.Open)
value = DateTime.Now
Return True
Catch
'an exception was thrown so return false
Return False
End Try
End Function
然后你可以这样称呼它:
Dim value As DateTime = DateTime.MinValue
If ReadValueFromFile(value) Then
Debug.WriteLine("File read at time:" & value)
End If
答案 1 :(得分:0)
简答:不。您的职能定义是合同,您必须履行。您可以将您的函数定义为简单地返回超级类型Object
,这将允许您返回任何内容,但是当您返回时,您将如何知道类型是什么?为什么你想要返回多种可能的类型呢?如果没有令人讨厌的代码来嗅探类型,甚至可能需要处理和吞下异常,你将无法判断你的函数是否成功。只是不要去那里。
答案 2 :(得分:0)
你不能返回不同的类型,但你可以像TryParse方法那样构建它:
Public Function test(ByRef Result As DateTime) As Boolean
Result = Date.Now
Try
' this file is nonexistent, so it will crash
IO.File.Open("C:/asdasd.txt", IO.FileMode.Open)
Catch
Return False
End Try
Return True
End Function
然后将其称为:
Dim resultDate as DateTime
If Not test(resultDate) Then
' Do Fail Code
End If
正如@ steve-pettifer指出的那样,使用异常来控制流量是不好的,所以这样的事情会更好:
Public Function test(ByRef Result As DateTime) As Boolean
If Not IO.File.Exists("C:/asdasd.txt") Then
Result = DateTime.MinValue
Return False
End If
IO.File.Open("C:/asdasd.txt", IO.FileMode.Open)
Result = Date.Now
Return True
End Function
答案 3 :(得分:-1)
执行此操作的最佳方法是抛出描述错误的异常。 然后,您可以根据需要自定义异常的内容(因此类型)。抛出的异常类型可以某种方式被视为备用返回类型。