Подтвердить что ты не робот

Какое исключение бросать, когда метод пытается использовать поле, которое может быть нулевым?

Я действительно работаю над разработкой Framework, а это означает, что вам нужна действительно сильная методология кодирования.

У меня возникла проблема, когда я не знаю, какой класс, порожденный System.Exception, мне нужно бросить. В основном это случай, когда у меня есть класс с полями, которые могут быть optionnaly инициализированы конструктором и которые имеют методы, использующие эти поля. Какое исключение я должен выполнить, если пользователь не инициализировал эти поля? (что означает, что они равны нулю)

Вот пример:

public class MyConnection
{
    private Uri endpointUri;

    public Uri EndpointUri
    {
        get
        {
            return this.endpointUri;
        }

        set
        {
            this.endpointUri = value;
        }
    }

    public MyConnection()
    {
    }

    public MyConnection(Uri endpointUri)
    {
        this.endpointUri = endpointUri;
    }

    public FileStream GetFile()
    {
        if (this.endpointUri != null)
        {
            // My doer methods
        }
        else
        {
            throw new TheExceptionINeedToThrow("endpointUri", ...);
        }                
    }
}

Обратите внимание, что я читал целую главу "Руководство по дизайну рамок" в отношении обработки и метаданных исключений и что я не нашел подходящего решения этот точный случай. Или, может быть, я что-то не понял...

Спасибо за вашу помощь.

EDIT: факт, что я предоставляю пустой конструктор, кажется немного запутанным в отношении моей проблемы, но он полностью добровольный. В некоторых объектах, которые должны соответствовать диапазону различных состояний, которые не могут быть дублированы в нескольких объектах, иногда полезно.

4b9b3361

Ответ 1

Throw InvalidOperationException:

Исключение, которое вызывается, когда вызов метода недействителен для текущего состояния объекта.

Обратите внимание, что нулевая ссылка не передается в метод - она ​​уже существует при вызове метода - поэтому это текущее состояние объекта является недопустимым, а не аргументом.

Однако было бы лучше предотвратить создание объекта таким образом, чтобы начать, если это вообще возможно, - это должно быть свойство записи? Вы когда-нибудь захотите, чтобы экземпляр имел нулевой конечный URI?

Ответ 2

NullReferenceException, InvalidArgumentExecption или ApplicationException все будет в порядке, если в описании исключения явно указано, что это пустое.

Ответ 3

Как и другие, я порекомендую InvalidOperationException (потому что Джон Скит сказал это) :)

Если вы вызываете функцию с нулевым параметром, тогда я буду использовать ArgumentNullException.