Se lanza una excepción adicional

Aquí hay un escenario extraño que no puedo entender en C#:

try
{
    Call to database.
    If results from database are empty
          throw new Exception("No results");
}
catch(Exception ex)
{
    if (ex.Message.Equals("No results"))
        throw;
    else
        throw new Exception("Exception from database");
}

Por derecho, la salida debería ser: Exception ("No results")

Sin embargo, por el momento, sigue arrojando 2 excepciones, es decir Exception("No results") y Exception("Exception from database").

Actualizaciones: intenté lanzar el 'ex' como una excepción interna, por lo tanto, 'throw new Exception("Exception from database", ex)'. Resulta que ex es en realidad 'Exception("No results").

¿Alguien puede explicarme por qué está sucediendo esto?

¡Gracias!

PD: Modificado un poco lo anterior. Espero que sea más claro ahora. Es 'lanzar' no 'retornar'. Disculpas por el mal uso de los términos.

preguntado el 22 de mayo de 12 a las 08:05

Tu pregunta no tiene sentido. Las excepciones no regresan y no hay forma de que se puedan lanzar 2 al mismo tiempo en el mismo hilo. -

No puede tener 2 excepciones 'devueltas'. Por favor, dé una mejor descripción. Publique la captura circundante donde observe esto. -

¿A qué te refieres con "regresar"? ¿Cómo puedes tener 2 excepciones? -

Un programa corto pero completo que demuestre el problema ayudaría aquí... -

Ejecuté tu código y solo entra if y no en else caso. Así que no veo dos excepciones siendo 'lanzadas' (Su thrown no devuelto". esta escrito en codigo throw Exception). -

2 Respuestas

Tiene una excepción al llamar a la base de datos (o al procesar los resultados de la base de datos).

Por cierto, si no encuentra algunos datos en la base de datos, rara vez es una situación excepcional. Simplemente devuelva una colección nula o vacía.

Foo GetFooById(int id)
{
   try
   {
       Call to database.
       If results from database are empty
          return null;
   }
   catch(SqlException ex)
   {   
      throw new MyDataAccessException("Cannot find foo", ex);
   }
}

Y otro consejo: no use excepciones para el control de flujo.

contestado el 22 de mayo de 12 a las 08:05

Hola, no. La llamada a la base de datos estuvo bien, cuando la probé en modo de depuración. - bernardlim

Tal vez tenga NullReferenceExeption, IndexOutOfRangeException, excepción de cating o alguna otra excepción. La razón podría estar en el código de procesamiento de resultados de su base de datos. No te tragues tu excepción. Proporcione una excepción original al crear una nueva, como en mi código anterior. - sergey berezovskiy

Sí, buen consejo, estaba trabajando en el código de otra persona, que usaba excepciones para el control de flujo. Por cierto, como pregunta secundaria, también intenté crear una excepción personalizada, con la excepción original como la excepción interna de la personalizada. Sin embargo, una vez que pasa por WCF, la excepción interna desaparece. ¿Es este el comportamiento correcto de WCF? - bernardlim

@juniordeveloper87 sí, las excepciones WCF pasaron como mensaje de error SOAP y tiene FaultException en el cliente. Si quieres pasar algo más interesante, mira genérico FaultException<T>. - sergey berezovskiy

No estoy 100% seguro de su fragmento de código, pero parece que la razón por la que parece tener "dos" excepciones es probablemente porque está volviendo a lanzar la original.

Eche un vistazo a este enlace para ver la diferencia en C# entre "throw ex" (el caso habitual) y "throw":

http://geekswithblogs.net/sdorman/archive/2007/08/20/Difference-between-quotthrowquot-and-quotthrow-exquot-in-.NET.aspx

contestado el 22 de mayo de 12 a las 08:05

Hola, no, no se debe a tirar ex o tirar. Probé ambos, y el comportamiento es el mismo. Todavía se lanzan 2 excepciones. - bernardlim

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.