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