【发布时间】:2011-03-29 11:23:37
【问题描述】:
给定以下代码:
try
// code1
try
// code2
catch ex as exception
end try
// code3
catch ex as exception
end try
将两个异常变量命名为相同或应该使用不同的名称是否有任何副作用?
【问题讨论】:
标签: c# vb.net exception exception-handling
给定以下代码:
try
// code1
try
// code2
catch ex as exception
end try
// code3
catch ex as exception
end try
将两个异常变量命名为相同或应该使用不同的名称是否有任何副作用?
【问题讨论】:
标签: c# vb.net exception exception-handling
不,应该没问题。它们是完全独立的变量。至少,在 C# 中就是这种情况——在 VB 中我不能肯定地说,但是如果在阅读代码时除了潜在的混淆之外还有任何副作用,我会感到非常惊讶:)
特别是,这两个变量具有不同的作用域,因为两者都不是 真正 嵌套在声明另一个的块中 - “内部”一个在外部 try 中声明堵塞。如果你写了一个 try/catch 块在 catch 块内,那么嵌套的 catch 块就不能重用相同的变量名。
【讨论】:
我无法回答 VB。
根据 C# 规范(第 8.10 节),异常变量是一个局部变量,其范围扩展到 catch 块。
这意味着在单独的 catch 块中为该变量使用相同的名称没有问题。这样就可以了:
static void Main(string[] args)
{
try
{
bool success = true;
MyData myData = ReadMyDataFromFile();
try
{
WriteMyDataToDB(myData);
}
catch (SqlException ex)
{
Console.WriteLine("An error occured saving the data.\n" + ex.Message);
success = false;
}
WriteLogFile(myData, success);
}
catch (IOException ex)
{
Console.WriteLine("An error occured reading the data or writing the log file.\n" + ex.Message);
}
}
在这种情况下,第二个 catch 块将捕获通过进程发生的任何 IOException,而第一个 catch 块将捕获在 WriteMyDataToDB(MyData) 中发生的任何 SqlException,并且 catch 变量具有相同名称的事实使得没有区别。
如果您在另一个 catch 块中有一个 try-catch(这将是非常不寻常的),那么您将遇到重用相同名称的问题。
static void Main(string[] args)
{
try
{
DoStuff();
}
catch (IOException ex)
{
try
{
Console.WriteLine("IOException" + ex.Message);
}
catch (Exception ex)
{
Console.WriteLine("Another exception!" + ex.Message);
}
}
}
会报如下错误:
不能在此范围内声明名为“ex”的局部变量,因为它会给“ex”赋予不同的含义,后者已在“父或当前”范围中用于表示其他内容
【讨论】: