2011-11-20 222 views
1

我是寫作課。下面是功能之一:C# - 拋出異常類

public string GetAttribute(string attrName) 
{ 

    try 
    { 
     return _config.AppSettings.Settings[attrName].Value; 
    } catch(Exception e) 
    { 
     throw new ArgumentException("Element not exists", attrName); 
     return null; 
    } 
} 

然後,我使用它的主要形式MessageBox.Show(manager.GetAttribute("not_existing_element"));

Visual Studio中拋出的線路異常:throw new ArgumentException("Element not exists", attrName);

,但是,我希望得到一個異常在線MessageBox.Show(manager.GetAttribute("not_existing_element"));

我該怎麼做? 上傳:對不起,英語不好。

回答

1

您正在濫用異常處理。在你的代碼中,如果你得到(例如)NullReferenceException,你會抓住它,然後拋出一個ArgumentException

重寫你的方法沒有任何異常處理:

public string GetAttribute(string attrName) 
{ 
    return _config.AppSettings.Settings[attrName].Value; 
} 

這樣,你是不是重置堆棧跟蹤和吞嚥原始異常。

在獲取調用行上的異常方面 - 您將永遠無法在不引發異常的行處發生異常。

+0

不知道我完全同意這一點 - 如果設置不存在,將返回一個空值。這不會導致MessageBox.Show調用的問題嗎? – Tim

+0

@Tim - 異常會冒泡。 'MessageBox.Show'不會被執行。如果'attrName'不存在,'_config.AppSettings.Settings [attrName]'將是'null',對'.Value'的調用將導致'NullRefereceException'。 – Oded

+0

好的,現在我明白了(在我睡覺的時候)。謝謝:) – Tim

0

幾件事情:

首先,你會得到一個無法訪問的代碼爲您捕捉返回空語句警告,因爲罰球將返回之前執行。您可以簡單地刪除返回null語句。其次,我不確定你在MessageBox這一行獲得異常是什麼意思,但我認爲你的意思是你想在那裏捕捉它。在試圖捕獲中調用MessageBox。

try 
{ 
    MessageBox.Show(manager.GetAttribute("not_existing_element")); 
} 
catch (Exception ex) 
{ 
    MessageBox.Show(ex.Message); 
}