2010-08-13 6 views

답변

3

아니요, 괜찮을 것입니다. 그것들은 전적으로 독립 변수입니다. 적어도 C#의 경우입니다. VB에서 확실하게 말할 수는 없지만, 코드를 읽을 때 잠재적 인 혼란을 초월하는 부작용이 있다면 정말 놀랍습니다.

특히, 두 변수는 다른 범위를 가지지 않습니다. 둘 중 하나도 이 아니고 실제로는이 다른 블록을 선언 할 때 중첩 된 것입니다. "내부"가 바깥 쪽 시도 블록 블록 내에서 선언됩니다. catch 블록 내에서 try/catch 블록 을 작성한 경우 중첩 된 catch 블록은 동일한 변수 이름을 재사용 할 수 없습니다.

0

VB에서는 대답 할 수 없습니다.

C# 사양 (§8.10)에 따르면 예외 변수는 범위가 catch 블록으로 확장되는 로컬 변수입니다.

즉,이 변수에 동일한 이름을 별도의 catch 블록에 사용하는 데 문제가 없음을 의미합니다. 첫 번째 catch 블록이 WriteMyDataToDB(MyData)에서 발생 SQLException이를 잡을 동안

이 경우
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 변수는 동일한 이름을 가지므로 아무런 차이가 없습니다.

다른 catch 블록 내에 try-catch가있는 경우 (매우 비정상적인 경우) 동일한 이름을 다시 사용하는 문제가 발생합니다.

A local variable named 'ex' cannot be declared in this scope because it would give a different meaning to 'ex', which is already used in a 'parent or current' scope to denote something else

:

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); 
      } 

     } 

    } 

다음과 같은 오류를 줄 것이다