给出以下代码:
try
// code1
try
// code2
catch ex as exception
end try
// code3
catch ex as exception
end try
将两个异常变量命名为相同或是否有不同的名称是否有任何副作用?
答案 0 :(得分:3)
特别是,这两个变量具有不同的范围,因为实际上都没有嵌套在声明另一个的块中 - “内部”变量在外部 try 中声明块。如果您在catch块中编写了try / catch块,那么嵌套的catch块无法重用相同的变量名。
答案 1 :(得分:0)
我不能回答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'赋予不同的含义,'ex'已在'parent或current'范围内用于表示其他内容