2009-12-11 14 views
9

J'ai essayer et attraper où je suis attrapais différents types d'erreur:C# valeur est déclarée mais jamais utilisé

catch (XmlException XmlExp) 
{ 
    return false; 
} 

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

Notez que XMLException XMLExp est déclarée mais jamais utilisée. Est-il possible d'attraper la XMLException sans déclarer une variable locale?

Est-ce code valide:

catch (XmlException) 
{ 
    return false; 
} 
+3

Avez-vous jamais essayé de supprimer le texte 'XmlSchExp' (rien d'autre)? Essayer. :) –

+11

sérieusement, essayez! cela prend moins de temps que de poster la question. aussi, utilisez simplement 'throw;' au lieu de 'throw GenExp; 'votre intention est de repousser l'exception –

+2

Aussi, il est mauvais de lancer une exception dans le bloc catch:' throw GenExp; '. Vous perdrez la trace de la pile. Il suffit d'écrire 'throw' renvoyer une exception interceptée. –

Répondre

17

Oui, comme celui-ci

catch (XmlException) 
{ 
    return false; 
} 

catch (XmlSchemaException) 
{ 
    return false; 
} 

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

Trop vite! lol. – James

+14

Utilisez catch (Exception) {throw} à la place. Cela permet de garder les informations sur la piste de craquage correctes. Renouveler l'exception détruit la pile d'origine –

+3

@Sander - ou simplement omettre ce bloc d'accrochage si c'est juste une nouvelle saisie – philsquared

2

Oui. Il suffit de manquer le nom de la variable:

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

omettent simplement le nom de la variable. Pour la dernière capture je conseille d'utiliser throw; au lieu de throw GenExp - que ce dernier perd la pile d'appels. Bien que si vous ne faites vraiment rien de plus qu'une rethrow alors omettez tout le bloc catch.

5

Il suffit d'utiliser

catch (XmlException) 
{ 
    throw; 
} 

Lorsque vous jetez un objet d'exception spécifique comme throw ex la trace de la pile se redéfinie.

1

Oui, vous pouvez:

catch (XmlException) 
{ 
    return false; 
} 

Bien sûr, toutes les autres règles concernant les exceptions appliquer - à savoir ne pas les utiliser pour le contrôle de flux, ce qui évite des situations où ils pourraient être jetés, etc.

6

Pour ce faire,

catch (XmlException) 
{ 
    return false; 
} 

catch (XmlSchemaException) 
{ 
    return false; 
} 

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

Est également un code valide et attrape toutes les exceptions.

0

Remarque importante!

Il est un style de programmation extrêmement BAD - d'utiliser des constructions similaires:

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

Cela signifie que la pile d'exception commencera par ce point (de la pile), et vous pouvez perdre toutes les images de la pile, qui sont plus bas que ce point.

Correct:

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

1- Je croyais que tu étais censé le faire par vous-même.

2- catch (XmlException) // valide { return false; } catch (XmlSchemaException) // valide { return false; } capture (Exception GenExp)
{ lancer GenExp; } //
valide, mais n'a pas de sens parce que l'exception va arriver et il n'y a pas essayer bloc catch Händel il

Questions connexes