Поскольку вы используете имена (переменные), которые не описывают содержимое файла, вы допустили ошибку и приложили тот же файл.
Видите ли вы это?
res.render("graph4.ejs",
<%- include("graph4.ejs",
Вы пытаетесь отрисовать graph4.ejs
, включая graph4.ejs
, включая graph4.ejs
, включая graph4.ejs
, включая graph4.ejs
... до включения / предел памяти закончен.
Можно разработать метод для работы с доступными объектами только.
Это означает, что Вы, ожидают получать доступные объекты (не пустой в Вашем случае).
Это означает, что Вы не знаете, как реагировать и что сделать с недопустимыми объектами:
Таким образом, если Ваш метод не знает точно, как обработать недопустимый объект, и метод не будет следовать за дополнительной логикой в недопустимом случае, который необходимо поместить
Debug.Assert( Person );
в PrintAge
начните и это вынудит Вас осуществить проверки, верхние стеком вызовов.
Чем ниже функционируют в иерархии, тем меньше проверок она должна сделать. Следующее является недостатками выполнения регистраций функций, которые делают работу.
При разработке библиотеки будут методы, выставленные внешнему миру. Необходимо проверить входящие данные в это методы. Никакие проверки не требуются в методах, которые Вы не выставляете, потому что только Ваш код называет их, и его логика должна обработать все случаи, которые Вы приняли в выставленном названном методе.
--------------------------
| |
| Library |
| |
------- --------- ---------- |
| | | | | | |
| Outer | | Library | | Library | |
| | ===> | Entry | ===> | Backend/ | |
| World | | Method | | Helpers | |
| | | | | | |
------- --------- ---------- |
| |
| |
--------------------------
При принятии данных, которыми снабжают, в методе ввода необходимо выполнить требуемое действие и возвратить результат exspected, который является дескриптором все остающиеся случаи.
ОБНОВЛЕНИЕ
К clearify ситуация в библиотеке. Могли бы быть пустые проверки, но только из-за логики, не из-за проверки параметра. Существует две возможности для местоположения пустых проверок в библиотеке. Первый, если вызываемый метод знает, как обработать нулевые значения.
private CallingMethod()
{
CalledMethod(someData);
}
private CalledMethod(Object parameter)
{
if (parameter == null)
{
// Do something
}
else
{
// Do something else
}
}
И вторая ситуация, если Вы называете метод, который не может обработать нулевые значения.
private CallingMethod()
{
if (someData == null)
{
// Do the work myself or call another method
}
else
{
CalledMethod(someData);
}
}
private CalledMethod(Object parameter)
{
// Do something
}
Вся эта мысль состоит в том, чтобы отклонить дела, Вы не можете обработать immideatly и обработать все остающиеся случаи правильно. Если вход не допустим, Вы выдаете исключение. Это вынуждает вызывающую сторону библиотеки предоставить только допустимые значения и не позволяет вызывающей стороне продолжать выполнение с бессмысленными возвращаемыми значениями (помимо отмели вызывающей стороны исключение продолжение).
У Вас нет ничего для регистрации Main
- Вы используете new
оператор, который никогда не возвращает пустой указатель (за исключением Nullable<T>
).
Было бы совершенно разумно зарегистрироваться PrintAge
, особенно, если это было обнародовано. (Для частных API менее важно сделать проверку аргументов, но это может все еще быть очень полезно.)
if (person == null)
{
throw new ArgumentNullException("person");
}
В эти дни в C# 3.0 я обычно использую дополнительный метод для этого.
Я сказал бы, что, проверяя его n PrintAge, казалось, имел больше смысла, поскольку это выполняет контракт для стандартной программы. Вы могли, конечно, заменить пустой указатель, сверяется с Отладкой. Утверждайте () код для проверки в тестовое время, но не во время выпуска.
Вы означаете регистрироваться в обоих методах? Я зарегистрировался бы в PrintAge наверняка и если он имеет смысл в Основном также. Я не думаю, что в целом существует определенный ответ. Это зависит :-)
Я обычно позволяю своим пустым проверкам управляться моими ожиданиями; если я ожидаю, что что-то будет пустым, или не уверено в нем, я добавляю проверку. Иначе я не делаю. Исключения Nulllpointer среди самых легких проблем для отслеживания, так чрезмерное разбрызгивание кода чрезмерных увеличений размера проверок. В определенном примере я ничего не проверил бы, потому что это - intutitive, это не является пустым.
Что Вы хотели бы сделать, если экземпляр является пустым?
Я думаю, что это зависит от API, который Вы предоставляете и определяете контракт (способ, которым классы платформы .NET делают). Однако Вы не должны делать проверки на пустой указатель (в основном), если метод определяет то, что является ожидаемым результатом в случае нулевой ссылки, переданной ему.
Существует только один случай, что конструктор может возвратить пустой указатель [new()
на a Nullable<T>
] - таким образом, код вызова не должен проверять.
Вызываемый, вероятно, должен проверить; бросок ArgumentNullException
если это было пустым. В.NET 4.0 это будет лучше подаваться контрактами кода. Но еще;-p
Поскольку я понимаю Ваш вопрос, это является более общим, чем проиллюстрированный Вашим примером. Мои предпочтения следующие:
У Brad Abrams есть еще некоторый вход здесь: http://blogs.msdn.com/brada/archive/2004/07/11/180315.aspx
Избыточный код не является самым изящным, но его сейф.
Это зависит от того, кто Ваш предполагаемый пользователь, если Вы затем Ваш в управлении того, как все используется и проверки только необходимы, если Ваш неуверенный из том, каково состояние Ваших переменных будет.
Если Ваше создание этого, чтобы кто-то еще использовал затем пустые проверки, является, вероятно, хорошей идеей. Даже если Вы просто бросаете NullPointerException лучше для быстрого сбоя.
Определенно регистрация PrintAge
, это - правильное место для проверки. Это может быть избыточно, но не причинит никому боль, если Вы не выполняете его 1000 раз в секунду. (В зависимости от проверки выдают исключение или фиксируют его, если Вы можете),
Другая проверка, зависят от Вашего фактического потока, в этом примере у Вас нет потока, таким образом, я не могу прокомментировать тот бит. Но обычно рассматривайте свои параметры, как испорчено.
PrintAge должен быть методом на Человеке, не статическим взятием Человека как параметр. Никакая проверка не необходима.
Проверка нулевые значения делает код излишне сложным. Структурируйте свой код, чтобы ограничить (или устранить), случаи, где пустой указатель является возможным значением, и у Вас будет намного меньше проверок для записи.