Бросок ArgumentNullException

Предупреждение: невозможно изменить информацию заголовка - уже отправленные заголовки

Случается, когда ваш скрипт пытается отправить HTTP-клиенту клиенту, но он уже был выведен ранее, что привело к тому, что заголовки уже отправлены на клиент.

Это E_WARNING , и он не остановит сценарий.

Типичным примером может быть файл шаблона, подобный этому:


    
    My Page

...

Функция session_start() попытается отправить клиенту файлы cookie сеанса. Но PHP уже отправил заголовки, когда он написал элемент в выходной поток. Вам нужно будет переместить session_start() в верхнюю часть.

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

Часто пропускаемый вывод - это новые строки после закрытия PHP ?>. Считается стандартной практикой опускать ?>, когда это последняя вещь в файле. Аналогичным образом, еще одной распространенной причиной этого предупреждения является то, что перед открытием перед ним появляется пустое пространство, строка или невидимый символ, в результате чего веб-сервер отправляет заголовки и пробел / новую строку, таким образом, когда PHP начинает синтаксический анализ, он не сможет для отправки любого заголовка.

Если в вашем файле содержится более одного кодового блока , у вас не должно быть пробелов между ними. (Примечание: у вас может быть несколько блоков, если у вас есть код, который был автоматически сконструирован)

Также убедитесь, что в вашем коде не указаны знаки байтового заказа, например, когда кодировка скрипта является UTF -8 с BOM.

Вопросы, относящиеся

59
задан Jonathan S. 20 May 2013 в 21:09
поделиться

9 ответов

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

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

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

60
ответ дан ᴍᴀᴛᴛ ʙᴀᴋᴇʀ 24 November 2019 в 18:11
поделиться

Я всегда применяю практику сбой быстро . Если Ваш метод зависит от X, и Вы понимаете X, мог бы быть передан в пустом указателе, пустой указатель проверяют его и сразу повышают исключение вместо того, чтобы продлить точку отказа.

обновление 2016 года:

пример Реального мира. Я настоятельно рекомендую использование Аннотации Jetbrains .

[Pure]
public static object Call([NotNull] Type declaringType, 
                          [NotNull] string methodName, 
                          [CanBeNull] object instance)
{
    if (declaringType == null) throw new ArgumentNullException(nameof(declaringType));
    if (methodName == null) throw new ArgumentNullException(nameof(methodName));

операторы Guard были значительно улучшены с C# 6, обеспечивающим nameof оператор.

31
ответ дан Chris Marisic 24 November 2019 в 18:11
поделиться

Я предпочитаю явное исключение по этим причинам:

  • , Если метод имеет больше чем один аргумент SomeClass, это дает Вам возможность сказать, какой это (все остальное доступно в стеке вызовов).
  • , Что, если Вы делаете что-то, что может иметь побочный эффект прежде, чем сослаться на x?
14
ответ дан Joel Coehoorn 24 November 2019 в 18:11
поделиться

Я соглашаюсь с идеей перестать работать быстро - однако мудро знать, почему сбой быстро практичен. Рассмотрите этот пример:

void someMethod(SomeClass x)
{       
    x.Property.doSomething();
}

, Если Вы полагаетесь NullReferenceException, чтобы сказать Вам, что что-то было неправильно, как Вы будете знать то, что было пустым? Отслеживание стека только даст Вам номер строки, не, какая ссылка была пустой. В этом примере x или x.Property, возможно, и было пустым и не перестав работать быстро с агрессивной проверкой заранее, Вы не будете знать, который это.

11
ответ дан Andrew Hare 24 November 2019 в 18:11
поделиться

Я предпочел бы, чтобы параметр согласовал с явным ArgumentNullException, также.

Рассмотрение метаданных:

 //
    // Summary:
    //     Initializes a new instance of the System.ArgumentNullException class with
    //     the name of the parameter that causes this exception.
    //
    // Parameters:
    //   paramName:
    //     The name of the parameter that caused the exception.
    public ArgumentNullException(string paramName);

Вы видите, что строка должна быть названием параметра, который является пустым, и тем самым дайте разработчику подсказку на том, что идет не так, как надо.

9
ответ дан Oliver Friedrich 24 November 2019 в 18:11
поделиться

Лучше бросить ArgumentNullException как можно скорее. При броске его можно предоставить более полезную информацию о проблеме, чем NullReferenceException.

5
ответ дан g . 24 November 2019 в 18:11
поделиться

Необходимо явно бросить ArgumentNullException, если Вы ожидаете, что вход не будет пустым. Вы могли бы хотеть записать класс, названный охраной, которая обеспечивает вспомогательные методы для этого. Таким образом, Ваш код будет:

void someMethod(SomeClass x, SomeClass y)
{
    Guard.NotNull(x,"x","someMethod received a null x argument!");
    Guard.NotNull(y,"y","someMethod received a null y argument!");


    x.doSomething();
    y.doSomething();
}

метод NonNull сделал бы проверку ничтожности и бросил бы NullArgumentException с сообщением об ошибке, определенным в вызове.

5
ответ дан Szymon Rozga 24 November 2019 в 18:11
поделиться

1-Делают это явно, если это Вы не хотите Нулевого значения. Иначе, когда кто-то еще посмотрит Ваш код, они будут думать, что передача Нулевого значения принята.

2-Делают это более быстро, Вы можете. Таким образом, Вы не распространяете "неправильное" поведение наличия Пустого указателя, когда это не предполагается.

4
ответ дан Patrick Desjardins 24 November 2019 в 18:11
поделиться

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

3
ответ дан Aaron Fischer 24 November 2019 в 18:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: