2010-08-13 29 views
1

考慮下面的代碼:嵌套錯誤時拋出的變量名

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

是否有任何副作用命名的兩個異常變量相同或他們應該有不同的名稱?

回答

3

不,應該沒問題。他們完全是自變量。至少,C#中的情況 - 我在VB中無法確定,但在閱讀代碼時,如果出現任何潛在混淆的副作用,我會非常驚訝:)

特別是,兩個變量有不同的範圍,因爲實際上都不是嵌套在另一個塊內 - 「內部」一個是在外部嘗試塊內聲明的。如果您在catch塊內寫入try/catch塊,則該嵌套catch塊不能重用相同的變量名稱。

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

     } 

    } 

將爲下列錯誤:

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