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
