在函数中发生错误时返回不同的数据类型

时间:2014-05-28 07:06:46

标签: vb.net function return-type

好吧,我有一个功能,比如

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语句中的错误时,是否可以返回不同的数据类型?比如说,发生错误时返回一个布尔值或字符串?

4 个答案:

答案 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)

执行此操作的最佳方法是抛出描述错误的异常。 然后,您可以根据需要自定义异常的内容(因此类型)。抛出的异常类型可以某种方式被视为备用返回类型。