try-catch是否共享相同的范围块?

时间:2014-01-14 17:55:25

标签: c# try-catch scope

我有一个try-catch序列。

try 
{
    int tryCatchVar = 0
    ...other code...
}
catch
{
    if (tryCatchVar != 0) return;
}

我在try块中声明并分配了一个变量。通常,变量的范围是声明它的块以及嵌套在其中的所有块。但是,由于try-catch的关系方面很强,我想知道try中声明的变量是否在catch的范围内?

如果没有,那么我想我会想要做以下事情:

int tryCatchVar

try
{
    tryCatchVar = 0
    ...other code...
}
catch
{
    if (tryCatchVar != 0) return;
}

那会有用吗?


推理:

我有两个参数可能会抛出异常。但是,由于我的应用程序的限制(此时不可变)我只能将用户错误消息记录到一个特定的字符串。我正在考虑实现两个try-catch序列。如果其中一个/两个都被触发,它们将生成存储在tryCatch中的内部日志。然后,根据tryCatch的值,我会生成一条新的错误消息。

4 个答案:

答案 0 :(得分:4)

  

但是,由于try-catch的关系方面很强,我想知道try中声明的变量是否在catch的范围内?

您可以自己轻松测试,但答案是否定的。

(第二部分)

  

那会有用吗?

同样,你可以自己轻松地测试这个,但答案是否定的 - 因为它不会被明确分配。你可以轻松解决它:

int tryCatchVar = 0;

try
{
    ...other code...
}
catch
{
    if (tryCatchVar != 0) return;
}

(当然我强烈建议不要以这种方式捕获所有异常。使用有针对性的 catch块,扔掉异常是一个好主意至少没有记录它。)

答案 1 :(得分:4)

一般的经验法则是花括号定义范围。因此,无论您正在查看什么代码,无论您处理的语句类型如何,以下情况始终如一:

{
    int x;
}
{
    // x is now out of scope
}

但是,变量将在范围内,并且块也没有结束,即使新块已经启动,所以下面的例子说明了一个仍在范围内的变量:

{
    int x;
    {
        //x is still in scope
    }
}

答案 2 :(得分:2)

范围不同。你必须使用这样的代码:

int tryCatchVar = 0; // or some other value

try
{
    tryCatchVar = 1;
    ...other code...
}
catch
{
    if (tryCatchVar != 0) return;
}

简单来说,原因是try中的任何内容可能会或者可能不会在catch之前实际运行,具体取决于是否以及何时抛出异常,因此编译器不能假设那里发生了任何事情。

答案 3 :(得分:1)

没有; catch不在try的范围内。

相关问题