Имена переменных вложенных исключений - PullRequest
1 голос
/ 13 августа 2010

С учетом следующего кода:

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

Существуют ли какие-либо побочные эффекты при именовании двух переменных исключения или они должны иметь разные имена?

Ответы [ 2 ]

3 голосов
/ 13 августа 2010

Нет, это должно быть хорошо. Они полностью независимые переменные. По крайней мере, так обстоит дело в C # - я не могу сказать наверняка в VB, но я был бы очень удивлен, если бы были какие-либо побочные эффекты помимо потенциальной путаницы при чтении кода:)

В частности, две переменные имеют разные области видимости, поскольку ни одна из них на самом деле не вложена в блок, объявляющий другую - «внутренняя» объявлена ​​внутри внешнего блока try . Если вы написали блок try / catch в блоке catch , то этот вложенный блок catch не сможет повторно использовать то же имя переменной.

0 голосов
/ 13 августа 2010

Я не могу ответить за VB.

В соответствии со спецификацией C # (§8.10) переменная исключения является локальной переменной, область действия которой распространяется на блок 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 будет перехватывать любое SqlException, возникающее в WriteMyDataToDB(MyData), итот факт, что переменные catch имеют одно и то же имя, не имеет значения.

Если у вас есть try-catch внутри другого блока 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', чтоуже используется в родительской или текущей области для обозначения чего-то другого

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...