我有一个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的值,我会生成一条新的错误消息。
答案 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
的范围内。