嵌套的异常变量名称

时间:2010-08-13 13:16:36

标签: c# vb.net exception exception-handling

给出以下代码:

try
  // code1
  try
  // code2
  catch ex as exception
  end try
  // code3
catch ex as exception
end try

将两个异常变量命名为相同或是否有不同的名称是否有任何副作用?

2 个答案:

答案 0 :(得分:3)

不,那应该没问题。它们完全是自变量。至少,在C#就是这种情况 - 我在VB中无法肯定,但如果在阅读代码时出现任何可能产生混淆的副作用,我会感到非常惊讶:)

特别是,这两个变量具有不同的范围,因为实际上都没有嵌套在声明另一个的块中 - “内部”变量在外部 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'范围内用于表示其他内容