2010-07-29 6 views
8

Je vous écris un programme en C#, et je veux attraper des exceptions dues à la conversion « » (null) int. Quel est le nom de l'exception?C# - échec de l'analyse parse?

EDIT: Je ne suis pas sûr que je peux montrer ici le code complet ... Mais je suis sûr que vous n'avez pas besoin du code complet, donc:

 int num1 = Int32.Parse(number1.Text); 
     int num2 = Int32.Parse(number2.Text); 
+0

Pourquoi voudriez-vous connaître le nom de l'exception? Allez-vous l'attraper? (J'espère pas ...) –

+9

Notez également que "" et null sont des choses différentes. –

+0

La recherche de faux au lieu de gérer une exception serait-elle un problème? –

Répondre

27

Si vous pouvez l'éviter, ne codez pas par exception!

Le nom d'exception que vous recherchez est appelé FormatException.

Cependant, il serait plus judicieux d'effectuer d'abord un TryParse sur l'objet que vous tentez d'analyser, par ex.

int value; 
if(!int.TryParse("1", out value)) 
{ 
    // You caught it without throwing an exception. 
} 
+1

Pourquoi pas "if (! String.IsNullOrEmpty (i))" en premier? Sérieusement, vous ne voulez même pas engager le TryParse. Même si vous le faites un millier de fois et n'échouez qu'une seule fois, l'instruction if avant TryParse sera plus rapide. – DevinB

+5

@devinb: Ajouter deux lignes de code supplémentaires juste pour le rendre 10ms plus rapide? Cela me semble inutile micro-optimisation ... – Heinzi

+3

@George, ce serait génial si vous sauvegardé des revendications comme "Si vous pouvez l'éviter, ne pas coder par exception" et "ce serait plus intelligent" avec quelques faits froids: -) – Saustrup

9

En note, un moyen simple de trouver l'exception est de l'exécuter. Lorsque vous rencontrez l'erreur, il vous donnera le nom de l'exception.

0

Lorsque l'exception se déclenche, vous pouvez voir son type. La chose intelligente à faire est de gérer ce cas et d'afficher un message gracieux à votre utilisateur si possible.

1

dépend de ce que vous utilisez pour effectuer la conversion. Par exemple, int.Parse lancera ArgumentNullException, FormatException ou OverflowException. Les chances sont qu'il est ArgumentNullException que vous cherchez, mais si c'est une chaîne vide plutôt qu'une référence nulle, il est probablement va être FormatException

0

Vous êtes probablement d'obtenir un System.InvalidCastException, même si je pense que va dépendre de comment vous essayez d'effectuer la conversion. Cela dit, ne serait-il pas plus rapide/facile d'écrire simplement le code et de l'essayer vous-même? D'autant plus que vous n'avez pas spécifié comment vous serez en effectuer la conversion.

0

juste essayer. Ce code:

int.Parse(""); 

Lance une exception Format.

0

exceptions sont chers. Vous devriez utiliser int.TryParse. Il retournera le booléen faux si la conversion échoue.

0

Convert.ToInt32 ne génère pas d'exception de format ("chaîne d'entrée n'est pas au format correct") sur une chaîne vide. Vous pouvez l'utiliser s'il est acceptable que le résultat soit un 0 pour une chaîne nulle. (Pukes toujours sur une chaîne vide si)

 string s = null; 
     int i = Convert.ToInt32(s); 

Mais si vous attendez un certain nombre d'être dans la zone, vous devez utiliser soit TryParse (comme cela a été suggéré) ou un validateur d'une sorte d'informer l'utilisateur dont ils ont besoin pour entrer un nombre.

6

Jetons un coup d'oeil at the documentation (qui est une solution beaucoup plus propre que "l'essayer"):

statique int Parse publique (string s)

[...]

exceptions:

  • ArgumentNullException: s est nulle.
  • FormatException: s n'est pas au format correct.

Ceci devrait répondre à votre question. Comme d'autres l'ont déjà mentionné, vous posez peut-être la mauvaise question et vous voulez plutôt utiliser Int32.TryParse.

+0

+1 pour le lien de la documentation. – Brian