76 Глава 3. Среда Smalltalk Express
возникшей ситуации: “Message not understood” (“Сообщение не понято”),
“Division by zero” (“Деление на нуль”) и т.д. Кроме того, в панели окна
отобразится список контекстов выполнения методов (в Smalltalk Express —
стек вызовов методов), в котором перечислены все выполнявшиеся, но еще
не завершенные методы. Каждая строка в панели представляет один ме-
тод, при этом первым стоит метод, выполнявшийся самым последним. В
строке сначала написано имя класса объекта, получившего сообщение, а
затем, после ’>>’, селектор самого сообщения. Если используемый метод
определен в суперклассе получателя, имя класса, в котором определен ме-
тод, отображается в круглых скобках. Иногда ст рока будет иметь вид [ ]
in ClassName >> methodName. Это означает, что ошибка произошла во
время выполнения блока, расположенного в методе methodName из класса
ClassName. Поскольку система Смолток не делает никаких различий меж-
ду «системной библиотекой» и «вашим кодом», список контекстов может
состоять из смеси ваших методов и методов из библиотеки классов.
Бывает так, что правильный ку-
Рис. 3.6. Окно уведомления об ошибке
сок системного кода запускает ваш
код, содержащий ошибку. Встреча-
ется и другая ситуация: когда ваш
код вызывает некоторый метод из
библиотеки классов, а тот, в свою
очередь, вызывает множество дру-
гих методов из библиотеки клас-
сов, прежде чем, в конечном сче-
те, в одном из системных методов
не возникнет исключительная си-
туация. Это не означает, что вы на-
шли ошибку в самой системе. Это,
как правило, означает, что в вашем коде было сделано нечто такое, что
привело к возникновению некоторой проблемы, которая не обнаруживала
себя до тех пор, пока система не попыталась выполнить запрещенную в
ее собственном коде операцию (подобную доступу к ключу, которого нет в
указанном словаре).
Список контекстов можно просматривать снизу вверх, следуя тем путем,
которым система выполняла код. Если наверху находятся методы системы,
переместитесь ниже (обратно по времени), чтобы найти место, где начи-
нается ваш код. Но, как уже было сказано, ваш код мог создать «плохой
объект» намного раньше, и в счастливом неведении передать его системе,
где он и вызвал ошибку. Если метод, который приводит к ошибке, уже воз-
вратил объект, вы его не увидите в стеке вызовов. В этом случае, чтобы