2009-05-22 107 views
7

該代碼非常簡單 - 問題是groupPath字符串中存在無效字符(確切地說是'/')。爲什麼會捕獲所有的塊實際上並沒有捕獲所有

我試圖做的事情(至少作爲一個停止差距)是跳過DirectoryEntries,我不能得到cn ---不管爲什麼。

但是,當我運行此代碼catch塊不運行,我得到: 服務器不可操作。和未處理的System.Runtime.InteropServices.COMException。

爲什麼catch塊不能捕捉到這個異常。

try 
{ 
    using (DirectoryEntry groupBinding = new DirectoryEntry("LDAP://" + groupPath)) 
    { 
     using (DirectorySearcher groupSearch = new DirectorySearcher(groupBinding)) 
     { 

      using (DirectoryEntry groupEntry = groupSearch.FindOne().GetDirectoryEntry()) 
      { 
       results.Add(string.Format("{0}", groupEntry.Properties["cn"].Value.ToString())); 
      } 
     } 
    } 
} 
catch 
{ 
    Logger.Error("User has bad roles"); 
} 

附加意見: 的代碼實際上是一個自定義RoleProvider,而奇怪的是,如果我參考,此提供在一個簡單的WinForms應用程序,並調用此相同的方法用相同的輸入catch塊完全按照它想要做的。我認爲這表明所提出的關於.NET異常與COM異常的答案並不準確。 雖然我不明白爲什麼從WebDev服務器執行時無法捕獲此代碼。

+4

? – 2009-05-22 16:24:16

+0

你會得到什麼樣的例外?什麼線程? – 2009-05-22 16:30:16

+2

另外,你可以添加異常嗎? (Exception.ToString()) – 2009-05-22 16:33:14

回答

13

當您不指定要捕獲的內容時,它將默認爲.NET異常。您的異常是在COM中,.NET未設置爲捕獲異常。對付這種情況的最好辦法是趕COM例外,應該是這個樣子:

try 
    { 

    } 
    catch (System.Runtime.InteropServices.COMException COMex) 
    { 

    } 
    catch (System.Exception ex) 
    { 

    } 
2

從try塊中拋出一個收到COMException將被捕獲並catch塊吞噬。

休息一下,讓自己喝杯咖啡,在「Logger.Error ...」行上放置一個斷點,然後再試一次。

3

有三個方面的原因:

  1. 有一個錯誤在運行時
  2. 應用程序和/或線程結束爲一些執行
  3. 你沒有看到整個部分的代碼圖片

我個人投票3,和我有過,我不知道爲什麼有些代碼段不處理我的例外無數調試會話的時候,其實它是Visual Studio中爲configu紅色停止所有拋出的異常,無論它們是否被捕獲。

您是否試過讓程序繼續在調試器中運行並查看它是否在catch-block中結束?

另外,檢查Visual Studio中的設置,進入Debug-> Exceptions對話框,並檢查是否有任何Thrown複選框被選中。如果你有,那可能是你的問題。

當然,如果你在運行時看到這個問題,沒有附加調試器,那麼我不知道,除了上面的第1點和第2點。

當然,總是有第4點:未知。

2

除了收到COMException也有asynchronus例外切勿陷入如:

  • OutOfMemoryException異常
  • StackoverflowException(不,這不是與此相關的網站:)開個玩笑)
  • ThreadAbortException

你確定不是這種情況嗎?

1

我有一個類似的問題。我正在調用引發錯誤的VB6 COM對象。實際的異常類型竟然是System.Reflection.TargetInvocationException。 innerException被設置爲COMException。我最終捕獲了System.Reflection.TargetInvocationException並在調試器或構建中檢查了InnerException