try catch块外的变量会失去价值

时间:2013-01-11 01:58:54

标签: c# .net

我有一点问题。我有一个函数,在try-catch-finally块之外有一个字符串,根据块内部发生的情况而改变。一旦完成,我想显示它。我的问题是块中更改的值返回到它具有的原始值。我该如何解决这个问题?

string error = "No issues";

try{
    error = "Correct";
}catch(Exception ex){
    error = "Wrong:" + ex.Message.ToString();
}finally{
    // Closes connection
}

MessageBox.Show(error);

2 个答案:

答案 0 :(得分:0)

我不清楚,如果有问题的字符串在方法之外声明。如果您100%确定,为字符串赋予了新值,则以下代码可能会解决您的问题:

static void Foo(string s)
{
    try
    {
        s = "OK";
    }
    catch { }
}

static void Main(string[] args)
{
    string temp = "??";
    Foo(temp);
    Console.WriteLine(temp); //prints ??
    Console.ReadLine();
}

因为您按值传递字符串。如果您需要更改值,您应该:

制作ref参数:

static void Foo(ref string s)

并将其命名为

Foo(ref temp);

或从方法中返回新值:

    static string Foo(string s)
    {
        try
        {
            s = "OK";
        }
        catch { }
        return s;
    }

并称之为:

temp = Foo(temp);

答案 1 :(得分:0)

您发布的代码会显示一个带有文字

的消息框
  

正确

如果没有抛出异常,否则消息

  

错误:(加上异常的消息属性)

它永远不会显示消息

  

没有问题

因为你在try块的第一行覆盖了error的初始值。

根据您发布的代码,

error永远不会丢失一个值(就像我猜成 null 一样)。最终错误将超出范围(例如,当您退出定义此代码的方法时)。

<强>更新

我拿了你的代码,创建了一个全新的WinForms项目,双击Form1来创建一个Load事件处理程序,并在你的代码中发布如下:

    private void Form1_Load(object sender, EventArgs e)
    {
        string error = "No issues";

        try
        {
            error = "Correct";
        }
        catch (Exception ex)
        {
            error = "Wrong:" + ex.Message.ToString();
        }
        finally
        {
            // Closes connection
        }

        MessageBox.Show(error);
    }

结果是一个消息框,上面写着“正确”。

如果这不是您在实际代码中看到的内容,则表示您没有共享足够的代码来重现问题。