2014-04-07 34 views
1

我以爲我可以在我的項目中捕獲另一個類拋出的異常,但我一定是做錯了。在第一類中,我周圍我打電話給其他類用try/catch塊:另一個類拋出的catch異常?

try 
{  
    ImportPowerPoint.CreateTitle(textBoxPpt.Text, textBoxPkg.Text); 
} 
catch (FormatException ex) 
{ 
    MessageBox.Show(ex.Message, "ERROR", 
    MessageBoxButtons.OK, 
    MessageBoxIcon.Warning); 
} 

在第二類中,這就是我拋出異常:

if (!_layoutMap[(int)Layouts.A].ContainsValue(Fields.Title)) 
    throw new FormatException("Standard (A) Layout does not contain a title."); 

if (!_layoutMap[(int)Layouts.A].ContainsValue(Fields.Txt1)) 
    throw new FormatException("Standard (A) Layout does not contain a txt1."); 

if (!_layoutMap[(int)Layouts.A].ContainsValue(Fields.Prompt)) 
    throw new FormatException("Standard (A) Layout does not contain a prompt."); 

當我運行程序時,它會立即中斷引發異常的地方,而不是顯示我在try/catch塊中定義的錯誤窗口。我沒有正確處理這個try/catch嗎?

爲了澄清,我強制通過刪除我解析的PowerPoint中的某些部分來發生異常。例如,當程序失敗時,因爲我刪除了Title字段,所拋出的異常的類型是FormatException。調用類中的我的catch不應該處理這個問題嗎?

編輯:我想我可能已經找到了導致這種情況發生的原因。拋出的異常在另一個線程中。所以,因爲它在另一個線程中,這是否意味着這就是爲什麼我的try/catch沒有捕獲異常?

+0

只是爲了澄清你是說'ImportPowerPoint.CreateTitle'方法拋出沒有被捕獲的異常?因爲它看起來應該捕獲所有'FormatException'並顯示你的消息框。 – Chris

+0

實際上,這可能很重要,實際的異常正在從'ImportPowerPoint.CreateTitle'調用的另一個類中拋出。我認爲,無論異常發生在何處,無論是在立即調用的類中,還是從該類中調用的類,如果這是合理的,調用類將捕獲該異常。 – Kevin

+0

如果該方法調用其他類的東西,那麼catch應該仍然可以捕獲。代碼在其他類中的事實並不是問題(並且實際上通常是預料之中的,因爲您經常捕獲框架類中的異常而不是您自己的代碼)。你肯定在這段代碼中(並且它不會從代碼中的其他地方拋出異常)? – Chris

回答

0

它在IDE中突然通知異常被拋出。如果再次按下F5繼續運行,應該點擊你的catch處理程序。

+0

這是事實,Theres是大多數IDE中的一箇中斷窗口,可以在程序中斷時爲您提供詳細信息 – Jonny

+0

不幸的是,我的情況發生了什麼:在我按F5鍵繼續之後,它會再次彈出消息。我一遍又一遍地打F5,程序剛剛打開,彈出消息說'FormatException未被處理'。 – Kevin

+0

發生這種情況時調用堆棧是什麼樣的? - 是通過你的陷阱調用的投擲位置? –

0

沒有什麼與例外有關的類。您的調用代碼(ImportPowerPoint.CreateTitle(...);)應該能夠捕獲由CreateTitle()引發的異常。

查看您的Visual Studio配置爲捕獲所有異常(不是隻抓那些未處理):

  1. 轉到「調試」菜單
  2. 選擇「例外...」
  3. 取消選中'Thrown'列下的複選框

您通常希望IDE捕獲未處理的異常,所以我會保留另一列的選中狀態。