2010-07-12 36 views
5

我有一個簡單的try/catch塊奇的try/catch行爲

try 
{ 
    // Open the connection 
    _connection.Open(); // [1] 
} 
catch(OracleException ex) // [2] 
{ 
    // Handle the exception 
    int x = ex.ErrorCode; 
} 

永遠不會執行的漁獲物和運行報告「OracleException是未處理的」在[1]這只是讓我目瞪口呆。顯然,我有一個關聯的異常類型的catch語句。我甚至在[2]處嘗試了完全限定類型Oracle.DataAccess.Client.OracleException,但仍然未處理異常。

實際上,我可以得到捕捉工作的唯一方法是在[2]捕捉System.Exception的。什麼導致了這種奇怪的行爲?

+0

當你發現'Exception'當你寫的'ex.GetType什麼是印刷()的ToString()'? – ChaosPandion 2010-07-12 17:49:21

+1

聽起來像是OracleException被封裝在一個不同類型的Exception中。完整的堆棧跟蹤是什麼意思? – Chris 2010-07-12 17:50:08

+0

當被捕獲爲異常時,它返回「Oracle.DataAccess.Client.OracleException」 – Matthew 2010-07-12 17:57:28

回答

4

您是否動態地加載程序集,可能使用Assembly.LoadFrom或類似的東西?如果是這樣,你可能會遇到一種情況,你有多種類型的類型加載到不同的加載上下文中。

加載到不同的上下文

裝配體呈現相同類型的具有不同身份,以便它們不匹配類型相等檢查等

MSDN

  • 負載上下文包含發現組件 通過探測:在GAC在 主機程序集存儲中(如果運行時爲 託管),或位於應用程序域的ApplicationBase和 PrivateBinPath中。大部分過載的Load方法都會將裝配加載到此 上下文中。

  • 負載從上下文包含 組件爲其用戶提供 不包括在通過探測搜索的 目錄的路徑。 LoadFrom,CreateInstanceFrom,和 ExecuteAssembly是由路徑加載的 方法的實例。

當然,這只是一個猜測,所以我可能是錯的。

+0

聽起來像你和我有相同的理論。 – 2010-07-12 17:54:08

+0

這是一個很好的建議,我要檢查一下GAC。我知道我有工作站安裝了兩個版本的Oracle ODP客戶端。我敢打賭有一個問題。 – Matthew 2010-07-12 18:01:01

1

你可能想趕上更一般DbException

try 
{ 
    // Open the connection 
    _connection.Open(); // [1] 
} 
catch(DbException ex) // [2] 
{ 
    // Handle the exception 
    int x = ex.ErrorCode; 
} 
2

也許是拋出Oracle.DataAccess.Client.OracleException的Oracle.DataAccess.Client.OracleException代替。我知道這聽起來很奇怪,但可以將兩種名稱完全相同的類型加載到給定的AppDomain中。

嘗試......

try 
{ 
    // Open the connection 
    _connection.Open(); // [1] 
} 
catch(Exception ex) // [2] 
{ 
    if (ex.GetType() == typeof(OracleException)) Debug.WriteLine("is match"); 
    else Debug.WriteLine ("is not match"); 

    // Handle the exception 
    int x = ex.ErrorCode; 
} 

另一種可能性是,異常包裹。您可能會收到包含OracleException的InvalidOperationException。

最後,該錯誤可能只是剛剛你的try塊之後。要麼你誤讀堆棧跟蹤,要麼堆棧跟蹤中的行號是錯誤的。兩者都發生在我身上。

+0

我只需要指出你的VB'else'。 :) – ChaosPandion 2010-07-12 17:55:50

+0

愚蠢的C#和其缺乏拼寫檢查。我不知道爲什麼它不像VB那樣照顧我這樣的事情。 (這是奇怪的本身,因爲VB的編譯器不關心你如何大寫關鍵字。) – 2010-07-12 18:06:03

+0

我認爲你和Chris在正確的軌道上。我之前意識到我有一個InvalidCastException錯誤,說它不能將Oracle.DataAccess.Client.OracleException強制轉換爲Oracle.DataAccess.Client.OracleException。對我來說,似乎有一個版本問題是正確的? – Matthew 2010-07-12 18:06:47