字符串值在Vb.net中尝试捕获

时间:2012-12-27 21:58:50

标签: c# vb.net declaration definition declare

我很难理解为什么这总是会返回一个空变量

    Private Function checkEnvelopeStatus(aEnvelopeID As String) As String
    Dim lEnvelopeStatusMessage As String

    Try
        Dim lEnvelopeStatus = mDsapi.RequestStatusEx(aEnvelopeID)
        lEnvelopeStatusMessage = "Subject:" & lEnvelopeStatus.Subject & vbCrLf & "Status Code: " & lEnvelopeStatus.Status
    Catch ex As Exception
        MessageBox.Show(ex.StackTrace, ex.Message)
    End Try

    Return lEnvelopeStatusMessage
End Function

然而,这将返回我想要的信息

    Private Function checkEnvelopeStatus(aEnvelopeID As String) As String
    Dim lEnvelopeStatusMessage As String

    Try
        Dim lEnvelopeStatus = mDsapi.RequestStatusEx(aEnvelopeID)
        aEnvelopeID = "Subject:" & lEnvelopeStatus.Subject & vbCrLf & "Status Code: " & lEnvelopeStatus.Status
    Catch ex As Exception
        MessageBox.Show(ex.StackTrace, ex.Message)
    End Try

    Return aEnvelopeID 
End Function

当我的TRy catch关闭后,函数的本地变量似乎被清除掉了。然而,当我用进入的参数替换它时,我能够保留Try Catch外部的字符串吗?我主要是一个C#/ C ++开发人员,所以这对我来说是混乱的行为。谁能解释为什么会发生这种情况?

这是上面代码的一个更加清理的版本

Public Function foo(a As String) As String
    Dim b As String
    Try
        b = "banana:"
    Catch ex As Exception

    End Try

    Return b
End Function

它表现出相同的行为。

4 个答案:

答案 0 :(得分:3)

在C#中,您无法在执行流程中编译路径存在的方法代码,这可能导致从方法退出而不初始化返回值。使用未分配的变量会出现编译器错误。

在VB.NET中,如果更改了选项,则可以避免错误 在项目选项的“生成”页面中,“在分配前使用变量”警告错误。 (我强烈建议这样做)

(不确定选项的确切名称,因为我使用的是Visual Studio的本地化版本)

答案 1 :(得分:1)

该代码不应该编译,我试过这个,它给了我一个编译器错误“错误3使用未分配的局部变量'b'”

你的编译器出了什么问题,你在用什么?

    static public string foo(string a)
    {
        String b;
        try
        {
            b = "banana";
        }
        catch
        {

        }

        return b;
    }

答案 2 :(得分:1)

直到你重新抛出这个消息才能编译。请考虑以下事项:

public String foo(String a) {
    String b;

    try {
        b="banana:";
    }
    catch {
        throw;
    }

    return b;
}

此代码将编译,因为如果有异常,则重新抛出。 编译器预测像无法访问的代码这样的逻辑问题(尽管无法访问的代码不是错误)。 VB.net中的等价:

Public Function foo(a As String) As String
    Dim b As String

    Try
        b = "banana:"
    Catch ex As Exception
        Throw ex
    End Try

    Return b
End Function

顺便说一句,捕获任何异常被认为是编码的不良做法。

答案 3 :(得分:0)

我在C#中编写了相同的代码

public string foo(string a)
{
    String b;
    try
    {
        b = "banana";
    }
    catch
    {

    }

    return b;
}

}

它似乎表现出相同的行为。我被收回了。更多地考虑它,这是有道理的。我只是声明变量实际上并没有将它定义为任何东西。所以用这样的东西代替上面的例子:

        public string foo(string a)
    {
        String b = "";
        try
        {
            b = "banana";
        }
        catch
        {

        }

        return b;
    }
}

解决了我所有的问题。希望这可以帮助将来的某个人。你知道的越多......