2011-05-31 55 views
0

這是一個'最佳實踐'是什麼聲明新變量的問題,我現在已經看到了這種情況幾次。我有一個類,它的構造函數讀取配置文件,如:範圍時,圍繞'新'語句與try/catch在c#

ConfigMgr config = new ConfigMgr(args[0]); 

當然,如果你沒有這樣的說法運行控制檯應用程序,例外的結果。如果我按如下方式用try/catch包圍該行,則會出現錯誤'The name'config'在當前上下文中不存在'。可以理解的。

try 
{ 
    ConfigMgr config = new ConfigMgr(args[0]); 
} 
catch 
{ 
    Console.WriteLine("Config file not specified or incorrect in format. Exiting."); 
    Console.ReadLine(); 
} 

// Defaults 
string aucomposingfile = config.getValue("aucomposingfile"); 
string nzcomposingfile = config.getValue("nzcomposingfile"); 
...etc 

我可以分離出需要在構造函數中的參數部分 - 做try/catch塊外的新的ConfigMgr部分,然後像做config.LoadFile()在try/catch語句。但我無法想象這就是知情人員所做的。

有什麼想法?

謝謝!

+0

這就是我所要做的。 – BoltClock 2011-05-31 02:49:13

+0

你爲什麼認爲它錯了...我想每個人都會這麼做 – 2011-05-31 02:51:12

+0

感謝大家的意見。我不確定哪一個標記爲答案,因爲兩個答案都能很好地解釋它。任何建議表示讚賞(底部的'第一'的答案)?雙方都得到我的讚賞! – Glinkot 2011-05-31 06:53:39

回答

3

沒有理由爲什麼你不能做到這一點:

ConfigMgr config = null; 
try 
{ 
    config = new ConfigMgr(args[0]); 
} 
catch (/* catch a specific exception!! */) 
{ 
    //log it: 
    Console.WriteLine("Config file not specified or incorrect in format. Exiting."); 

    //escape from here, because you don't want to continue: 
    throw;  
} 

string aucomposingfile = config.getValue("aucomposingfile"); 
string nzcomposingfile = config.getValue("nzcomposingfile"); 

當然的,按理說它更正確的方式,可能是嘗試使用它們之前檢查命令行參數,並拋出一個特定的異常,如果他們不不符合你的要求 - 你依靠他們,所以先驗證他們。與僅僅使用它們並捕獲異常相比,這具有更好的代碼流。這樣你的catch塊變得更專注於配置文件更具體的問題,而不是處理命令行參數的問題。

+0

謝謝。首先關於驗證的評論也很有意義。乾杯 – Glinkot 2011-05-31 08:22:56

3

如果您需要訪問多個try塊中的變量,則需要聲明在該塊之前初始化該變量。簡單地聲明並初始化爲null就足夠了。

Foo foo = null; 
try 
{ 
    foo = DoSomethingToGetFoo(); 
} 
catch (SpecificException ex) 
{ 
    // do whatever, foo is accessible but may require null-checking 
} 
finally 
{ 
    // ditto 
} 

// still accessible 

顯然,如果您希望在其他位置訪問,則在外部範圍聲明變量是必需的。但是初始化也是必要的,因爲C#編譯器需要證明變量已經在允許使用之前被初始化。如果「標準」初始值設定項在try的範圍內,則編譯器無法保證在稍後使用之前它已經發生。

對於您自己的代碼,您可以決定是否需要對變量進行的所有操作都可以包含在try之內。如果是這樣,顯然將其範圍限制在該塊。但在某些情況下,您需要更廣泛的範圍。 (請參閱:using對於IDisposable對象的擴展。)

+0

感謝您的評論安東尼。非常感激! – Glinkot 2011-05-31 08:23:12