4.5. Обработка ошибочных ситуаций 93
в чем состоит проблема, а само окно представляет пользователю список
контекстов выполнения в момент ошибки.
Это, по-видимому, одно из самых распространенных сообщений об
ошибке, с которым вы будете сталкиваться при появлении окна уведом-
лений Walkback. Часто встречается ситуация, в которой правильное со-
общение посылается не тому объекту; например, когда пытаются посылать
сообщение объекту nil. Обычно подобное происходит тогда, когда что-то за-
были определить, инициализировать или присвоить значение переменной.
Но такое может происходить и в том случае, если предыдущее сообщение
вместо правильного объекта возвращает непредусмотренный, неправиль-
ный объект (в том числе и nil). Чтобы отследить подобную ситуацию, надо
использовать стек вызовов, отображаемый окнами отладки.
Именно такая ошибка возникает, когда в создаваемом методе неправиль-
но поставлен или вообще пропущен оператор возврата объекта, то есть
пропущен символ ^. Потери только одного оператора возврата достаточно,
чтобы испортить длинную цепочку вызовов. И если вы получили сооб-
щение об ошибке doesNotUnderstand:, проверьте, правильные ли объекты
возвращаются используемыми методами.
Такая ошибка особенно неприятна в методах создания экземпляра. Пра-
вильный метод создания экземпляра должен выглядеть примерно так:
new
^ super new myInitialize
причем метод myInitialize (пере)определяется в создаваемом классе так, что-
бы должным образом инициализировать переменные экземпляра. Если вы
забыли возвратить значение, то есть написали нечто похожее на super new
myInitialize, при вызове new будет возвращен не вновь созданный экземпляр
класса, а сам класс, и, когда вы попытаетесь послать первое же сообщение
вашему «новому» объекту, это немедленно вызовет исключительную ситу-
ацию doesNotUnderstand: с сообщением вида:
MyClass class (Object)>>doesNotUnderstand:
Заметьте, что это сообщение отличается от сообщения, которое появляется,
когда новый экземпляр действительно не понимает сообщения:
MyClass (Object)>>doesNotUnderstand:
Если вновь созданные объекты не понимают некоторых сообщений и
вы не можете разобраться, почему подобное происходит, проверьте, не ис-
пользуете ли вы класс вместо экземпляра.
Неправильное сообщение, посланное правильному объекту, отследить
сложнее. Вполне возможно, что, набирая выражение, вы просто ошиблись
и исказили то сообщение, которое хотели напечатать. Такая же ошибка до-
вольно часто возникает и из-за неправильной расстановки скобок, особенно