2011-10-02 60 views
1

crmFactory.RegisterDemoAccount拋出Exception使用未賦值的變量。爲了使用變量res我需要初始化它。C# - 如何try catch塊

由於AccountRegistrationResponse不可初始化,我如何聲明res而不會收到有關使用未分配變量的編譯錯誤? 我可以將它分配給null,但我認爲這不是一個好的編程方法。

AccountRegistrationResponse res /*=null*/; 
try 
{ 
    res = crmFactory.RegisterDemoAccount(CrmConfigRepository.CrmOwnerUserId 
            , CrmConfigRepository.CrmOrganizationName 
            , CrmConfigRepository.CrmBusinessUnitName 
            , demo.getData()); 
} 
catch (Exception e) 
{ 
     _log.Error("Cannot create demo account", e); 
} 
_log.Debug(res.getString()); 

回答

1

我理解你爲什麼不願分配res爲空 - 感覺毫無意義,因而是錯誤的。但是,在這種情況下,這是一種常見的方法,但是,如果需要在指定塊之外的對象。假設你在try/catch塊中分配你的變量是正確的(在許多情況下它並不罕見),我不會擔心它。

但是,如果分配失敗會發生什麼?第二次日誌記錄調用將嘗試取消res,並拋出NullReferenceException。這不好。

0

你需要把日誌行的try/catch內部,使得編譯器知道res已被初始化。

try 
{ 
    res = ... 
    _log.Debug(res.getString()); } 
catch (Exception e) 
{ 
    _log.Error("Cannot create demo account", e); 
} 
2

在捕獲未知異常之後,您不應該嘗試繼續您的方法。任何事情都可能出錯,假設繼續下去是沒有道理的。如果你嘗試,只會有壞事發生。

要麼返回一個錯誤的結果,或者更好的,只是重新拋出原始異常:

catch (Exception e) 
{ 
     _log.Error("Cannot create demo account", e); 
     throw; 
} 

現在,編譯器可以看到try塊成功完成後res總是被賦值。

0

這是正確的做法。唯一的事情,如果nullRegisterDemoAccount一個有效的返回值,你可以添加你只是RegisterDemoAccount後設置爲true一個bool initialized = false

0

將它分配給null,就像你說的,如果你在try/catch之外需要它。這不是糟糕的編程方式。

0

,但我不認爲這是一個很好的編程方法。

爲什麼?如果您沒有初始化res,然後RegisterDemoAccount(...)(或其之前的其他表達式)拋出,res將不會在try語句中分配。

因此執行可以用res未分配達成最後陳述(在catch塊之後)。

的問題是在這最後語句中使用res - 編譯器可以看到它可以得到這一點沒有初始化。