>
> This is intentional.  Martin's reply is one half of the issue, that you
> want to be able to proceed after defining a method in  the debugger.  The
> otehr half is that you want to be able to catch doesNotUnderstand: in an
> exception handler and proceed with a result, e.g.
>

[nil zork]
on: MessageNotUnderstood
do: [:ex|
ex message selector == #zork ifTrue:
[ex resume: #ok].
ex pass]

evaluates to #ok.


This all work correct with ProtoObject implementation

ProtoObject>>doesNotUnderstand: aMessage

    ^ MessageNotUnderstood new
        message: aMessage;
        receiver: self;
        signal


28 июля 2010 г. 0:48:18 UTC+4 пользователь dionisiydk
<[email protected]>написал:

> I think that the bug is that you haven't modified the system to quit on an
>> UnhandledException.  i.e. in a headless context control should never get
>> back to the doesNotUnderstand: method if the MessageNotUnderstood exception
>> is not caught.  How should one continue after an unhandled error?
>>
>
> With my approach I have "null object message eating" behavior. And when any
> unhandled errors raised in system user will see nothing. Only log file will
> contain it.
>
> 2010/7/28 Eliot Miranda <[email protected]>
>
>>
>>
>> 2010/7/27 Denis Kudriashov <[email protected]>
>>
>> Hello,
>>>
>>> I found method doesNotUnderstand have very strange implementation
>>>
>>> Object>>doesNotUnderstand: aMessage
>>>       | exception resumeValue |
>>>     (exception := MessageNotUnderstood new)
>>>         message: aMessage;
>>>         receiver: self.
>>>     resumeValue := exception signal.
>>>     ^exception reachedDefaultHandler
>>>         ifTrue: [aMessage sentTo: self]
>>>         ifFalse: [resumeValue]
>>>
>>> When Error has no handlers #defaultAction is executed. For
>>> MessageNotUnderstood #defaultAction is UnhandledError signal. And for
>>> UnhandledError #defaultAction is opening debugger.
>>> If you change it to do nothing (^self) you get infinite loop on any
>>> MessageNotUnderstood signal.
>>> It is because "ifTrue" branch executed in doesNotUnderstood method and
>>> message resend to receiver.
>>>
>>> Why method implemented such way? Why it is differ from ProtoObject
>>> implementation. I think It's bug implementation.
>>>
>>
>> This is intentional.  Martin's reply is one half of the issue, that you
>> want to be able to proceed after defining a method in  the debugger.  The
>> otehr half is that you want to be able to catch doesNotUnderstand: in an
>> exception handler and proceed with a result, e.g.
>>
>> [nil zork]
>> on: MessageNotUnderstood
>> do: [:ex|
>>  ex message selector == #zork ifTrue:
>> [ex resume: #ok].
>> ex pass]
>>
>> evaluates to #ok.
>>
>>
>>>
>>> I found this problem when I try implement stuff to turn off openning
>>> debugger on unhandled error (and write it to log)
>>>
>>> UnhandledError>>defaultAction
>>>     "The current computation is terminated. The cause of the error should
>>> be logged or reported to the user. If the program is operating in an
>>> interactive debugging environment the computation should be suspended and
>>> the debugger activated."
>>>     ^ToolSet debugError: exception.
>>>
>>> ToolSet class>>debugError: anError
>>>     "Handle an otherwise unhandled error"
>>>     self default ifNil:[ | ctx |
>>>         Smalltalk
>>>             logError: anError description
>>>             inContext: (ctx := anError signalerContext)
>>>             to: 'PharoDebug.log'.
>>>         self inform: (anError description, String cr, ctx shortStack).
>>>         ^anError return].
>>>     ^self default debugError: anError
>>>
>>> I just implement subclass of StandartToolSet with empty method
>>> #debugError:. Then I do "ToolSet default: MyToolSet". And now unhandled
>>> errors raise infinit loop and never return.
>>>
>>> I fix that by:
>>>
>>> MyToolSet>>debugError: anError
>>>    anError class = MessageNotUnderstand ifTrue: [anError
>>> reachedDefaultHandler: true].
>>>
>>> I think this is hack. But it is work. No errors show to user.And all work
>>> good.
>>>
>>> What do you think?
>>>
>>
>> I think that the bug is that you haven't modified the system to quit on an
>> UnhandledException.  i.e. in a headless context control should never get
>> back to the doesNotUnderstand: method if the MessageNotUnderstood exception
>> is not caught.  How should one continue after an unhandled error?
>>
>> HTH
>> Eliot
>>
>>
>>> Best regards,
>>> Denis
>>>
>>>
>>>
>>> _______________________________________________
>>> Pharo-project mailing list
>>> [email protected]
>>> http://lists.gforge.inria.fr/cgi-bin/mailman/listinfo/pharo-project
>>>
>>
>>
>> _______________________________________________
>> Pharo-project mailing list
>> [email protected]
>> http://lists.gforge.inria.fr/cgi-bin/mailman/listinfo/pharo-project
>>
>
>
_______________________________________________
Pharo-project mailing list
[email protected]
http://lists.gforge.inria.fr/cgi-bin/mailman/listinfo/pharo-project

Reply via email to