Отладчик открывается как ответ на необработанное исключение.Чтобы лучше объяснить, мы можем начать с запуска исключения, которое не обнаруживается нигде в системе.Например, мы можем выполнить на игровой площадке Error signal: 'an error'.
(сигнал выдаёт ошибку в Pharo).Откроется следующий отладчик:
![enter image description here](https://i.stack.imgur.com/0BciY.png)
Когда происходит исключение, система сначала пытается найти обработчик исключения для этого исключения.Если обработчик исключений не найден, система отправляет сообщение defaultAction
исключению.Это реализовано в классе Error
как:
Error>>#defaultAction
"No one has handled this error, but now give them a chance to decide how
to debug it. If none handle this either then open debugger
(see UnhandedError-defaultAction)"
UnhandledError signalForException: self
Таким образом, система реагирует на необработанное исключение, выдавая другое исключение UnhandledError
.Опять же, если не найдены обработчики исключений для нового исключения, система отправляет сообщение defaultAction
объекту исключения.В этом случае исключение является экземпляром UnhandledError
, и этот класс переопределяет defaultAction
со следующей реализацией:
UnhandledError>>#defaultAction
<reflective: #unhandledErrorDefaultAction:message:>
^ UIManager default unhandledErrorDefaultAction: self exception
Метод unhandledErrorDefaultAction:
довольно прост и просто отправляет объекту исключения сообщение debug
.
MorphicUIManager>>#unhandledErrorDefaultAction: anException
anException debug
Метод отладки реализован в Exception
, корневом классе всех исключений в Pharo:
Exception>>#debug
"open a debugger on myself"
Processor activeProcess
debug: self signalerContext
title: self description
Так вот что открывает отладчик.
В случае отправки неизвестного сообщения объекту исключение типа MessageNotUnderstood
выдается методом Object>>#doesNotUnderstand:
.Это исключение следует той же цепочке, что и раньше, и система завершает отправку сообщения debug
в исключение MessageNotUnderstood
, которое открывает отладчик.
Короче говоря:
- , когданеизвестное сообщение отправляется объекту, система отправляет объекту сообщение
#doesNotUnderstand:
; doesNotUnderstand:
вызывает исключение типа MessageNotUnderstood
; - , если это исключение не перехвачено другимвозникает исключение типа
UnhandledError
; - , если этот новый
UnhandledError
не перехвачен, он просит менеджер пользовательского интерфейса обработать этот случай; - менеджер пользовательского интерфейса отправляет сообщение
debug
первоначальное исключение, в данном случае исключение MessageNotUnderstood
(это делает только MorphicUIManager
; другие менеджеры пользовательского интерфейса, такие как CommandLineUIManager
, выполняют другие действия, например, создание образа); - сообщение
debug
открывает отладчик
Обработчик для несуществующих переменных имеет совершенно другую реализацию, которая находится в реальном компиляторе.Когда код скомпилирован в классе с неизвестными переменными, компилятор обнаруживает это и спрашивает пользователя, что делать: создать новую переменную экземпляра или локальный параметр.
Если вы попытаетесь выполнить код, содержащий неизвестный класс, например UnnknowsClass new.
, компилятор также обнаружит это и спросит пользователя, что делать.В этом случае не возникает исключений.
Есть и другие помощники, которые используют тот же механизм, что и doesNotUnderstand:
, например, для получения уведомлений.Если вы выполняете Object new notify: 'a notification'
, метод notify:
генерирует исключение Warning
, которое заканчивается открытием отладчика.
![enter image description here](https://i.stack.imgur.com/sXT2j.png)