在下面的方法中,有很多調用Manager類的case語句(許多已被刪除)。例如,第一個調用ApplicationManager.GetByGUID。任何時候使用「經理」類,都會進行安全檢查。嵌套的try-catches還有更好的方法嗎?
問題:我有可能允許其中一些但不是全部的實體。所以當這個方法運行時,如果其中的一個出來了,它會拋出一個安全異常並且使整個報告崩潰。
有人向我建議,我可以在每個案件的周圍放一個try-catch塊,但是我讀得越多,我越覺得這可能是草率的。我承認並不是很瞭解異常情況......我希望有人能夠提出一種更好的方法來做到這一點......我需要能夠獲得良好的數據,並忽略那些拋出安全異常的數據....或者在這種情況下嘗試捕獲是否可以?
希望是有道理...感謝
private string GetLookup(string value, string type)
{
MySqlConnection mconn = new MySqlConnection(ConfigurationSettings.AppSettings["UnicornConnectionString_SELECT"]);
try
{
mconn.Open();
lock (reportLookups)
{
if (reportLookups.ContainsKey(type+value))
return reportLookups[type+value].ToString();
else if (reportLookups.ContainsKey(value))
return reportLookups[value].ToString();
else
{
switch (type)
{
case "ATTR_APPLICATIONNAME":
if (value != Guid.Empty.ToString())
{
reportLookups.Add(type + value, applicationManager.GetByGUID(value).Name);
}
else
{
reportLookups.Add(type + value, "Unknown");
}
mconn.Close();
return reportLookups[type + value].ToString();
break;
case "ATTR_CITYNAME":
reportLookups.Add(type + value, UMConstantProvider.UMConstantProvider.GetConstant<UMString64>(int.Parse(value), UMMetricsResourceLibrary.Enumerations.ConstantType.CITY_NAME, ref mconn));
mconn.Close();
return reportLookups[type + value].ToString();
break;
case "ATTR_COUNTRYNAME":
reportLookups.Add(type + value, UMConstantProvider.UMConstantProvider.GetConstant<UMString2>(int.Parse(value), UMMetricsResourceLibrary.Enumerations.ConstantType.COUNTRY_NAME, ref mconn));
mconn.Close();
return reportLookups[type + value].ToString();
break;
case "ATTR_ITEMDURATION":
MediaItem mi = mediaItemManager.GetMediaItemByGUID(value);
if (mi.MediaItemTypeID == (int)MediaItemType.ExternalVideo || mi.MediaItemTypeID == (int)MediaItemType.ExternalAudio)
{
reportLookups.Add(type + value, mediaItemManager.GetMediaItemByGUID(value).ExternalDuration);
mconn.Close();
return reportLookups[type + value].ToString();
}
else
{
List<BinaryAsset> bins = fileSystemManager.GetBinaryAssetsByMediaItemGuid(value, mi.DraftVersion);
var durationasset = from d in bins
where d.Duration != 0
select d.Duration;
if (durationasset.Count() > 0)
{
reportLookups.Add(type + value, durationasset.ToList()[0]);
}
else
{
reportLookups.Add(type + value, 0);
mconn.Close();
return reportLookups[type + value].ToString();
}
}
break;
}
}
return string.Empty;
}
}
finally
{
mconn.Close();
}
}
我認爲這更像是一個代碼重構的例子。你打開'type'參數,這是傳入的 - 爲什麼不分離出不同的方法?將使您的代碼更易讀易維護。另外,你爲什麼要在'case語句*和* finally塊中執行mconn.Close();'只是在最後一次做。 – RPM1984 2010-11-02 22:59:26
+1 @ RPM1984,我同意 – 2010-11-02 23:03:29
哇,這很快,謝謝傢伙 – 2010-11-02 23:14:07