[Pharo-project] Improving Pharo's Exception Hierarchy

Nicolas Cellier nicolas.cellier.aka.nice at gmail.com
Thu Apr 14 11:29:46 CEST 2011


We didn't say that creating classes is bad by nature, we spoke only
about compromise...
If you have a hierarchy of 1000+ class, then it makes the hierarchy
browser useless because we are flooded by unclassified information
flow.
It's fine grained mud, but from this POV it's still mud. It just means
we can't use it for finding information.
You might translate this saying "cherchez une aiguille dans une botte de foin".

The IDE still follows this late 70s classification :
category/class/protocol/method. This was tailored for a much smaller
namespace.
The only enhancement we made was to add another level like this:
 category-subcategory/class/protocol/method
We managed a x10 inflation in the namespace with such extension...
If we are to increase again our Dictionary, then we can't avoid a
reflexion on classification.

What you are proposing is to concentrate all Exception classification
in two levels:
category/class

Dale proposed a three level
category/class/method

Nicolas

2011/4/14 Toon Verwaest <toon.verwaest at gmail.com>:
> Somehow I feel like I offended someone :)
>
> I personally don't have experience with 10'000+ classes in a system. I do
> understand that's where you are coming from and do appreciate the insight.
>
> My personal experience has rather been the opposite until now. For example
> the Pharo/Squeak classbuilder is 1 single class doing everything. This is
> horrible; not just horrible because the code is completely horrid but it's
> non-extensible, non-configurable, non-reusable, contains tons of duplication
> _just because_ it is all put into one big ball of mud. By decomposing the
> classbuilder into 4 to 10 different classes I ended up having very little
> methods with very little code, and a very high level of configurability and
> understandability. I now actually use this classbuilder to build anonymous
> classes too, avoiding the whole problem with forgetting to copy in the
> format that everyone seems to have.
>
> And this experience was showing me that having classes for all _relevant_
> concepts actually pays off in the long run. Since you (and others) are
> saying that it doesn't for exceptions; and since I don't have enough
> experience there I'll take your advice into account when writing code ;)
>
> Toon
>
> On 04/14/2011 01:00 AM, Dale Henrichs wrote:
>>
>> On 04/13/2011 02:58 PM, Toon Verwaest wrote:
>>>
>>> Is it such a problem if you duplicate a certain exception class? At the
>>> moment you'll do the same anyway by not completely writing the exact
>>> same symbol.
>>
>> It's a simple matter of namespaces and volume of names ... with a large
>> open ended namespace you are more likely to have a number of redundant names
>> with slight differences in spelling showing up in different spots in the
>> hierarchy...with a logically segmented namespace each segment will have a
>> manageable number of names and the risk of duplication is reduced ... end of
>> discussion ...
>>
>> 10,000 names vs 30 names ... I can easily recognize duplicates in a list
>> of 30 names ... not so easy in 10,000 ... that is all ...
>>
>> to attempt to map every possible error condition onto a class will lead
>> you to 10,000 much quicker than using reasonCodes ... that is all ...
>>
>> I don't hate classes, it is a _practical_ matter ... if _you_ would rather
>> manage 10,000 names then I will say that it isn't practical ... I'm _not_
>> saying it is _wrong_, just not _practical_.
>>
>>>
>>> And if the problem is not finding classes anymore, maybe we need a
>>> better way of organizing the exception classes away from the standard
>>> classes so that they are as non-intrusive as symbols, but convey more
>>> information?
>>
>> And now you've hit the nail on the head ... in order to handle the extra
>> complexity you need additional tools ... before creating more tools, ask
>> your self the simple question: "Do I _need_ the additional complexity?" ...
>> if the answer is yes, then create the tool, if the answer is no, then you
>> don't need to create a new tool ..
>>
>> Again, this is a _practical_ matter...
>>
>>>
>>> self error: #keyNotFound
>>> does not really give much information; and isn't much more difficult to
>>> write than:
>>> KeyNotFoundException new in: self; key: key; signal
>>
>> From a practical perspective how many exception handlers will be written
>> to handle KeyNotFoundException ... I use at:ifAbsent: when I'm doing a look
>> up that I think might fail ... better than writing an exception handler ...
>>
>> If there is a real need to write a handler for KeyNotFoundException, then
>> by all means create the class, but until you actually NEED
>> KeyNotFoundException, `self error: #keyNotFound` or `NotFoundException
>> signal: #keyNotFound` will work just fine...
>>>
>>> although the second one gives you all the contextual information that
>>> the first one misses.
>>
>> _If_ you NEED the additional contextual information. It's just like
>> writing a framework that no uses ... there's nothing wrong with the idea or
>> the implementation, it's just that the framework didn't solve a problem that
>> anyone had...
>>
>> If you are going to create a class, I think the least it should do is
>> address an real problem, not an imaginary one.
>>
>> To say that "if one were to handle the KeyNotFoundException, they will
>> need the complete context", I prefer to say "Until one needs the complete
>> context of the KeyNotFoundException, don't bother creating class"
>>
>>>
>>> What I mean mostly: what about trying to figure out why you want to
>>> avoid decent exception classes and tackling that problem?
>>
>> Depends upon what your definition of a decent exception classes is? My
>> argument is simply that it is not _necessary_ to create a unique class for
>> every unique error condition ... I think that folks should answer the
>> question: "Will anyone every write an exception handler for this exception"
>> before creating the class ... if the answer is yes (or better yet, I am
>> writing code right now and need that exception) then by all means create the
>> class.
>>
>>> Maybe we don't want classes but exception objects that can pool data
>>> together? Maybe a very silly idea: what about just exception "classes"
>>> that have dictionaries to store enough information?
>>
>> That would be another way of doing things ... although using exception
>> classes and reasonCodes is pretty close to all that is needed...
>>
>> I agree with the notion that it isn't that useful to have a single Error
>> class and have all errors mapped to it ... on the other hand I don't think
>> it is particularly useful to have an exception class for every possible
>> error condition ... the compromise is to provide a smallish hierarchy of
>> excpetion classes with fairly general structure, provide a means for
>> uniquely identifying every possible error condition (I think that is
>> important) and then add new classes to the hierarchy when a demand for the
>> class is found ...
>>
>>
>
>
>



More information about the Pharo-project mailing list