>
> 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