2010-07-12 9 views
5

que tiene un simple bloque try/catchTry Odd Comportamiento/Catch

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

La captura nunca se ejecuta y los informes de ejecución 'OracleException fue controlada' en [1], que sólo hace girar mi cabeza. Claramente, tengo una declaración catch para el tipo de excepción asociado. Incluso probé el tipo totalmente calificado, Oracle.DataAccess.Client.OracleException en [2] y aún así la excepción no se ha manejado.

La única manera en que puedo lograr que la captura funcione es capturando System.Exception en [2]. ¿Qué está causando este extraño comportamiento?

+0

Cuando captura 'Exception' qué se imprime cuando escribe' ex.GetType(). ToString() '? – ChaosPandion

+1

Parece que OracleException está siendo envuelto en un tipo diferente de excepción. ¿Qué dice el rastro de la pila completa? – Chris

+0

Cuando se detecta como Excepción, devuelve "Oracle.DataAccess.Client.OracleException" – Matthew

Respuesta

4

¿Está Carga dinámica de las asambleas de todos, posiblemente usando Assembly.LoadFrom o algo similar? Si es así, es posible que esté abordando una situación en la que el tipo que tiene varios tipos se cargue en diferentes contextos de carga.

ensamblados cargados en un contexto diferente presentan los mismos tipos con diferentes identidades para que no coincide con el tipo cheques igualdad etc.

De MSDN

  • El contexto de carga contiene conjuntos encontrados por sondeo: en el GAC, en un almacén de ensamblados de host si el tiempo de ejecución es alojado, o en ApplicationBase y PrivateBinPath del dominio de la aplicación. La mayoría de las sobrecargas del método Load cargan ensamblajes en este contexto .

  • La carga de contexto contiene conjuntos para los que el usuario presentó un camino no incluido en los directorios buscadas por sondeo. LoadFrom, CreateInstanceFrom y ExecuteAssembly son ejemplos de métodos que se cargan por ruta.

Por supuesto, esto es sólo una suposición, por lo que podría estar equivocado.

+0

Suena como tú y yo tenía la misma teoría. –

+0

Esta es una gran sugerencia, voy a consultar el GAC. Sé que tengo una estación de trabajo con dos versiones del cliente Oracle ODP instalado. Apuesto a que hay un problema. – Matthew

1

Es posible que desee captar el más general DbException.

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

Tal vez está arrojando Oracle.DataAccess.Client.OracleException en lugar de Oracle.DataAccess.Client.OracleException. Sé que suena extraño, pero es posible tener dos tipos con exactamente el mismo nombre cargado en un AppDomain determinado.

Prueba esto ...

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

Otra posibilidad es que la excepción se envuelve. Puede estar recibiendo una InvalidOperationException que contiene una OracleException.

Finalmente, el error puede ser justo después de su bloqueo de prueba. O lee mal la traza de pila o los números de línea en la traza de pila son incorrectos. Ambos me pasan todo el tiempo.

+0

Solo tengo que señalar su VB 'else'. :) – ChaosPandion

+0

Estúpido C# y su falta de revisión ortográfica. No sé por qué no se ocupa de esas cosas para mí como lo hace VB. (Lo cual es extraño porque el compilador de VB no le importa cómo capitaliza las palabras clave.) –

+0

Creo que usted y Chris están en el camino correcto. Me di cuenta antes de que tenía un error de una InvalidCastException decir que no podía convertir Oracle.DataAccess.Client.OracleException en Oracle.DataAccess.Client.OracleException. Para mí, parece que hay un problema de versión, ¿verdad? – Matthew