Бросок исключения в блок if-else - PullRequest
3 голосов
/ 29 апреля 2011

Для начала я понял, что, возможно, есть лучший способ сделать это, и вместо того, чтобы выдавать исключение, я должен просто лучше обработать условие.При этом я столкнулся с неожиданным поведением, и мне более любопытно, почему это происходит, чем при использовании моего приложения.

В методе я пытаюсь получить доступ к файлу, предоставленному пользователем.В начале метода я проверяю, чтобы убедиться, что путь к файлу не Null или String.Empty, и выбрасываю исключение, если оно есть.Когда я проводил тестирование, я обнаружил, что исключение выдается независимо от состояния.Это нормальное поведение, или я что-то упустил?

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
}

ОБНОВЛЕНИЕ:

В моем тестовом сценарии вызывающий метод просто отправляет путь по умолчанию, который я жестко запрограммировал для теста.Я не завершил пользовательский интерфейс, поэтому код для определения пользователем пути не завершен.

private const string c_fooPath = "C:\\test\\text.txt"

public void CallingFoo()
{
    var xml = Foo(c_fooPath)

    // some code

}

ОБНОВЛЕНИЕ № 2:

Просто упомянуть некоторые другие мои тесты, которые у меня естьпытался.Я пытался

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
}

Ответы [ 2 ]

5 голосов
/ 29 апреля 2011

Я дал вашему коду быстрый тест, и он работает как положено, то есть выдает только исключение, если строка пуста или пуста.Отладьте ваш код, чтобы увидеть, действительно ли данный путь имеет содержимое и не является ли он пустым или нулевым.Может быть, что-то не так и в вызывающей функции.

Мой тест-код (возвращает void вместо вашего XElement):

class Program {
    static void Main(string[] args) {
        Foo("test");
    }

    public static void Foo(String path) {
        if (String.IsNullOrEmpty(path)) {
            throw new ArgumentNullException();
        }
    }
}

Вы также можете попробовать1010 * вместо String.IsNullOrEmpty.

Обновление: Может быть это или это помогает.

0 голосов
/ 29 апреля 2011

Попробуйте это:

private const c_fooPath = @"C:\test\text.txt"

public void CallingFoo()
{
    var xml = Foo(c_fooPath)

    // some code

}

При объявлении строковых переменных с косой чертой (\) используйте один из следующих способов:

1) private const c_fooPath = @"C:\test\text.txt"

2) private const c_fooPath = "C:\\test\\text.txt"

Надеюсь, это поможет!

Спасибо.

...