Levée d'une Exception dans un if-else bloc
Pour commencer, j'ai réalisé qu'il y a sans doute une meilleure façon de le faire, et plutôt que de lancer une exception, je devrais juste la poignée de la condition meilleure. Cela étant dit, j'ai couru dans un comportement inattendu et de plus je suis curieux de savoir pourquoi ce qui se passe de l'aide à ma demande.
Dans une méthode, je suis tentative d'accès à un fichier fourni par l'utilisateur. Au début de la méthode, je suis de vérifier que le chemin d'accès au fichier n'est pas Null
ou String.Empty
et lance une exception si il est. Quand j'ai été le tester, j'ai constaté que l'exception est levée, quelle que soit la condition. Est-ce un comportement normal, ou j'ai loupé quelque chose?
public static XElement Foo(String path)
{
if (String.IsNullOrEmpty(path))
{
throw new ArgumentNullException(); //this exception is thrown
//regardless of the value of 'path'
}
//code to open and parse file
//returns XElement
}
Mise à JOUR:
Dans mes tests scenerio, l'appel de la méthode est simple envoi d'un chemin d'accès par défaut que j'ai codé en dur pour le test. Je n'ai pas terminé l'INTERFACE utilisateur, de sorte que le code à l'utilisateur de définir le chemin d'accès n'est pas complète.
private const string c_fooPath = "C:\\test\\text.txt"
public void CallingFoo()
{
var xml = Foo(c_fooPath)
//some code
}
Mise à JOUR #2:
Pour n'en citer que certains de mes autres tests que j'ai essayé. J'ai essayé
if (String.IsNullOrEmpty(path))
{
Console.WriteLine("testing") //this line is skipped when my condition is
//false but runs when i force it to be true
throw new ArgumentNullException(); //this exception is thrown
//regardless of the value of 'path'
}
if (false)
{
throw new ArgumentNullException(); //the exception is not thrown here - the only
//condition i have found so far.
}
public static XElement Foo(String path)
{
path = "test";
if (String.IsNullOrEmpty(path))
{
throw new ArgumentNullException(); //exception is still thrown
}
//code to open and parse file
//returns XElement
}
Êtes-vous sûr que vous avez testé une condition où la chaîne a données? Cela semble comme il se doit seulement de jeter sur null ou vide... Regarde droit vers moi. Essayez de définir la chaîne de valeur, juste avant d'instruction si, et de voir si ça en jette toujours.
qu'est-ce que chaîne de caractères.Vide dans quel contexte êtes-vous de mentionner cela ?
Êtes-vous sûr de son lancer une exception quel que soit le chemin? Essayez de remplacer if(String.IsNullOrEmpty(chemin)) si(Faux) pour voir si ça en jette toujours une exception.
grâce corrigé la faute de frappe - c'est ce que je reçois pour poser cette question à 1h du matin. Je ne pense pas que la méthode d'appel est nécessaire, parce que je me demande pourquoi la ligne de lancer jeté quelle que soit la valeur de la chaîne est.
OriginalL'auteur psubsee2003 | 2011-04-29
Vous devez vous connecter pour publier un commentaire.
J'ai donné votre code un test rapide et il fonctionne comme prévu, j'. e. jette les seules exceptions si la chaîne est null ou vide. Déboguer votre code pour voir si le chemin a effectivement contenu et n'est pas vraiment vide ou null. Peut-être qu'il pourrait aussi quelque chose de mal en l'appelant de la fonction.
Mon testcode (renvoie vide au lieu de votre XElement):
Vous pouvez également essayer de
Convert.ToString((object)stringVar) == ""
au lieu deString.IsNullOrEmpty
.Mise à jour: Peut-être cette ou cette aide.
null
. Il s'est comporté correctement, donc mon problème est ailleurs, dans ma méthode. N'a tout simplement pas de bon sens. Merci.J'ai fourni deux liens, peut-être ceux-ci sont utiles. En particulier la première, semble considérer un problème similaire.
OriginalL'auteur Sebastian Dressler
Essayez ceci:
Lors de la déclaration des variables de chaîne ayant des slash (\) l'utilisation de l'une des manières suivantes:
1)
private const c_fooPath = @"C:\test\text.txt"
2)
private const c_fooPath = "C:\\test\\text.txt"
Espère que cela aide!
Grâce.
Pas un problème. Essayé l'extrait de code que vous avez fourni dans une application console et il fonctionne très bien 🙂
OriginalL'auteur Vaibhav