2009-12-11 14 views
9

tengo una oportunidad y captura donde estoy cogiendo diferentes tipos de errores:C# valor se declara pero nunca utilizado

catch (XmlException XmlExp) 
{ 
    return false; 
} 

catch (XmlSchemaException XmlSchExp) 
{ 
    return false; 
} 
catch (Exception GenExp) 
{ 
    throw GenExp; 
} 

en cuenta que XMLException XMLExp se declara pero nunca utilizado. ¿Es posible capturar la XMLException sin declarar una variable local?

Es este código válido:

catch (XmlException) 
{ 
    return false; 
} 
+3

¿Alguna vez se trate de quitar el texto 'XmlSchExp' (nada más)? Tratar. :) –

+11

en serio, ¡solo inténtalo! lleva menos tiempo que publicar la pregunta. también, simplemente use 'throw;' en lugar de 'throw GenExp;' su intención es volver a lanzar la excepción –

+2

También es una mala idea lanzar una excepción dentro del bloque catch: 'throw GenExp;'. Perderás el rastro de la pila. Simplemente escriba 'throw;' para volver a lanzar una excepción atrapada. –

Respuesta

17

Sí, como este

catch (XmlException) 
{ 
    return false; 
} 

catch (XmlSchemaException) 
{ 
    return false; 
} 

catch (Exception GenExp) 
{ 
    // inspect or use GenExp 
    throw; 
} 
+0

¡Demasiado rápido! lol. – James

+14

Use catch (Exception) {throw} en su lugar. Esto mantiene la información correcta de StrackTrace correcta. Retirar la excepción destruye el stacktrace original –

+3

@Sander - o simplemente omitir ese bloque de capturas por completo si solo está volviendo a lanzar – philsquared

2

Sí. Sólo se pierda el nombre de la variable:

catch (XmlException) 
{ 
    return false; 
} 
0
catch (XmlException) 
{ 
    return false; 
} 
catch (XmlSchemaException) 
{ 
    return false; 
} 
catch (Exception GenExp) 
{ 
    throw GenExp; 
} 

simplemente omite el nombre de la variable. Para el último retén aconsejaría usando throw; en lugar de throw GenExp - ya que éste pierde la pila de llamadas. Aunque si realmente no estás haciendo nada más que un nuevo lanzamiento, simplemente omite todo el bloque catch.

5

sólo tiene que utilizar

catch (XmlException) 
{ 
    throw; 
} 

Cuando se lanza un objeto de excepción específica como throw ex el seguimiento de la pila se reemplaza.

1

Sí se puede:

catch (XmlException) 
{ 
    return false; 
} 

Por supuesto, se aplican todas las demás reglas relativas a excepciones - es decir, no utilizarlos para control de flujo, evitando cualquier situación donde podrían ser lanzados, etc.

6

Haga esto

catch (XmlException) 
{ 
    return false; 
} 

catch (XmlSchemaException) 
{ 
    return false; 
} 

catch (Exception) 
{ 
    throw; 
} 
0
catch (Exception unknownException) 
{ 
    throw new Exception("Unknown error.", unknownException); 
} 
0
catch 
{} 

También es un código válido y atrapa todas las excepciones.

0

¡Aviso importante!

Es un estilo de programación extremadamente malo - al uso de construcciones similares:

try 
{ 
    // smth 
} 
catch(IOException e) 
{ 
    throw e; 
} 

Esto significa, que la pila de excepción se iniciará con este punto (de pila), y se puede perder ningún marcos de pila, que son más bajos que este punto.

correcta:

try 
    { 
     //smth 
    } 
    catch(IOException e) 
    { 
     throw; 
    } 
0

1- Creo que tenía que hacer esto por sí mismo.

2- catch (XmlException) // válido { return false; } catch (XmlSchemaException) // válido { return false; } catch (Excepción GenExp)
{ throw GenExp; }
// válida, pero no tiene sentido, porque la excepción va a pasar y no hay bloque catch tratar de Handel que

Cuestiones relacionadas