2011-08-11 10 views
8
internal static string ReadCSVFile(string filePath) 
{ 
    try 
    { 
     ... 
     ... 
    } 
    catch(FileNotFoundException ex) 
    { 
     throw ex; 
    } 
    catch(Exception ex) 
    { 
     throw ex; 
    } 
    finally 
    { 
     ... 
    } 
} 


//Reading File Contents 

public void ReadFile() 
{ 
    try 
    { 
     ... 
     ReadCSVFile(filePath); 
     ... 
    } 
    catch(FileNotFoundException ex) 
    { 
     ... 
    } 
    catch(Exception ex) 
    { 
     ... 
    } 
} 

Aquí en el ejemplo de código anterior, tengo dos funciones ReadFile y ReadCSVFile.
En el archivo ReadCSV, obtengo una excepción de tipo FileNotFoundExceptioon, que queda atrapada en el bloque catch (FileNotFoundException). Pero cuando lanzo esta excepción para atraparme en la captura (FileNotFoundException) de la función ReadFile(), queda atrapada en el bloque catch (Exception) en lugar de catch (FileNotFoundException). Además, al depurar, el valor de la ex dice como Objeto no inicializado. ¿Cómo puedo lanzar la excepción de la función llamada al bloque de captura de la función de llamante sin perder la excepción interna o al menos el mensaje de excepción?Lanzar excepción de la función llamada al bloque de captura de la función de llamador

+2

posible duplicado de [.NET - Excepciones Lanzar mejores prácticas] (http://stackoverflow.com/questions/22623/net-throwing-exceptions-best-practices) – Chris

+0

cuando usa el mismo objeto local de excepción, ¿está seguro de que la excepción interna es del tipo 'FileNotFoundException'? – NirMH

+0

No es un duplicado, pero una pregunta que carece de información para mostrar por qué no es un duplicado :) – PVitt

Respuesta

10

usted tiene que utilizar throw; en lugar de throw ex;:

internal static string ReadCSVFile(string filePath) 
{ 
    try 
    { 
     ... 
     ... 
    } 
    catch(FileNotFoundException ex) 
    { 
     throw; 
    } 
    catch(Exception ex) 
    { 
     throw; 
    } 
    finally 
    { 
     ... 
    } 
} 

Además de eso, si usted no hace nada en el bloque de captura de Regeneración de que no es necesario el bloque catch en absoluto:

internal static string ReadCSVFile(string filePath) 
{ 
    try 
    { 
     ... 
     ... 
    } 
    finally 
    { 
     ... 
    } 
} 

Implemente el bloque catch solo cuando desee agregar información adicional a la excepción lanzando una nueva excepción con la capturada como excepción interna o cuando desee manejar la excepción. No es necesario implementar un bloque catch en todos los métodos donde una excepción puede pasar.

+0

He intentado usar solo lanzar pero el resultado sigue siendo el mismo. Además, en realidad adjunto un mensaje personalizado a la excepción y luego lo lanzo. –

+0

Luego debe lanzar una nueva excepción con el mensaje personalizado y la excepción capturada como excepción interna: catch (Exception exc) {throw new MessageException ("Message", exc); } – PVitt

1

Simplemente use throw en la función llamada. No sobrecargue bloques catch con múltiples tipos de excepciones. Deje que el que llama se encargue de eso.

1

Debe reemplazar

throw ex; 

por

throw; 
+0

Lo intenté, pero sin ayuda. Todavía obtengo ObjectNotInitialized en el bloque catch del llamador para el objeto Exception. –

+1

Esta podría ser una otra excepción? – sll

0

En la función llamada sólo tiene que utilizar tiro como esto

try 
{ 
    //you code 
} 
catch 
{ 
    throw; 
} 

Ahora bien, si la excepción se plantea aquí, entonces esto va a ser capturado por la función de llamador.

0

Su código funciona bien aquí, Marque aquí http://ideone.com/jOlYQ

+0

¿Hay alguna diferencia si el fragmento de código pertenece a un servicio web en lugar de un código de consola simple? –

+0

No debería haberlo. Un servicio web es de nuevo un serivice alojado en un contenedor y podría ser otra aplicación de consola, aunque no tiene una consola visual representada para el usuario. Así que básicamente es C# y no. – Zenwalker

Cuestiones relacionadas