2010-07-12 10 views
5

Ho un semplice blocco try/catchProva Pari/Cattura Comportamento

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

La cattura non viene mai eseguito e le relazioni di runtime 'OracleException è stata gestita' in [1], che fa solo girare la testa. Chiaramente, ho una dichiarazione di cattura per il tipo di eccezione associato. Ho persino provato il tipo completo, Oracle.DataAccess.Client.OracleException in [2] e ancora l'eccezione non è gestita.

L'unico modo in cui posso effettivamente far funzionare la cattura è catturare System.Exception in [2]. Qual è la causa di questo strano comportamento?

+0

Quando si cattura 'Exception' cosa viene stampato quando si scrive' ex.GetType(). ToString() '? – ChaosPandion

+1

Sembra che OracleException sia incluso in un diverso tipo di Eccezione. Cosa dice la traccia dello stack completo? – Chris

+0

Quando viene rilevato come Eccezione, restituisce "Oracle.DataAccess.Client.OracleException" – Matthew

risposta

4

viene caricata dinamicamente assemblee a tutti, possibilmente utilizzando Assembly.LoadFrom o qualcosa di simile? In tal caso, è possibile che si stia verificando una situazione in cui il tipo di tipi mittenti è stato caricato in diversi contesti di caricamento.

Assiemi caricati nel contesto diverso presentano gli stessi tipi con identità in modo che non corrispondono tipo controlli di uguaglianza ecc

Da MSDN

  • Il contesto carico contiene assiemi trovati dai tastatura: in il GAC, in un gruppo di assemblaggio host se il runtime è ospitato, o in ApplicationBase e PrivateBinPath del dominio dell'applicazione . La maggior parte dei sovraccarichi del metodo di caricamento carico in questo contesto .

  • Il carico dal contesto contiene assiemi per cui l'utente disponibile un percorso non incluso nei directory cercati sondando. LoadFrom, CreateInstanceFrom e ExecuteAssembly sono esempi di metodi caricati per percorso.

Ovviamente questa è solo una supposizione, quindi potrei sbagliarmi.

+0

Sembra che tu ed io abbiamo avuto la stessa teoria. –

+0

Questo è un ottimo suggerimento, vado a controllare il GAC. So che ho una workstation con due versioni del client Oracle ODP installato. Scommetto che c'è un problema. – Matthew

1

Si potrebbe voler prendere il più generale DbException.

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

Forse lancia un Oracle.DataAccess.Client.OracleException anziché un Oracle.DataAccess.Client.OracleException. So che sembra strano, ma è possibile avere due tipi con esattamente lo stesso nome caricato in un determinato AppDomain.

Prova questo ...

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; 
} 

Un'altra possibilità è che l'eccezione è avvolto. Potresti ricevere una InvalidOperationException contenente un'eccezione OracleException.

Infine, l'errore potrebbe essere appena dopo il blocco try. O hai interpretato erroneamente la traccia dello stack oppure i numeri di riga nella traccia dello stack sono errati. Entrambi mi capita tutto il tempo.

+0

Devo solo indicare il tuo VB 'else'. :) – ChaosPandion

+0

Stupid C# e la sua mancanza di controllo ortografico. Non so perché non mi prenda cura di queste cose per me come fa VB. (Che è strano perché il compilatore di VB non si cura di come si capitalizzano le parole chiave.) –

+0

Penso che tu e Chris siete sulla strada giusta. Mi sono reso conto in precedenza che avevo un errore da InvalidCastException affermare che non poteva lanciare Oracle.DataAccess.Client.OracleException a Oracle.DataAccess.Client.OracleException. Per me sembra che ci sia un problema di versione giusto? – Matthew