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