About more precise default exception?

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
2 messages Options
Reply | Threaded
Open this post in threaded view
|

About more precise default exception?

stepharong
When I read that, I thought that errorNotIndexable would raise an  
Exception different from Error.
But this is not the case and it means that people should write not so good  
tests by checking Error
instead of a concrete Exception.

[[[
MyExampleSetTest >> testIllegal
        self should: [ empty at: 5 ] raise: Error.
        self should: [ empty at: 5 put: #zork ] raise: Error
]]]
We even have a rule that states that we should not catch on Error


at: index
        "Primitive. Assumes receiver is indexable. Answer the value of an
        indexable element in the receiver. Fail if the argument index is not an
        Integer or is out of bounds. Essential. See Object documentation
        whatIsAPrimitive. Read the class comment for a discussion about that the  
fact
        that the index can be a float."

        <primitive: 60>
        index isInteger ifTrue:
                [self class isVariable
                        ifTrue: [self errorSubscriptBounds: index]
                        ifFalse: [self errorNotIndexable]].
        index isNumber
                ifTrue: [^self at: index asInteger]
                ifFalse: [self errorNonIntegerIndex]

thoughts comments?

Reply | Threaded
Open this post in threaded view
|

Re: About more precise default exception?

Clément Béra
I agree this exception should be more specific.

By the way one needs to update all the primitive mutating objects, such as at:put:, so that when it fails because it attempts to mutate a read-only object a proper error is raised instead of SubscriptOutOfBounds with an in-bound index.

Maybe an intern can create a specific error for your case, add an error for read-only object and write / update tests for everything.

On Sun, Jan 22, 2017 at 6:28 PM, stepharong <[hidden email]> wrote:
When I read that, I thought that errorNotIndexable would raise an Exception different from Error.
But this is not the case and it means that people should write not so good tests by checking Error
instead of a concrete Exception.

[[[
MyExampleSetTest >> testIllegal
        self should: [ empty at: 5 ] raise: Error.
        self should: [ empty at: 5 put: #zork ] raise: Error
]]]
We even have a rule that states that we should not catch on Error


at: index
        "Primitive. Assumes receiver is indexable. Answer the value of an
        indexable element in the receiver. Fail if the argument index is not an
        Integer or is out of bounds. Essential. See Object documentation
        whatIsAPrimitive. Read the class comment for a discussion about that the fact
        that the index can be a float."

        <primitive: 60>
        index isInteger ifTrue:
                [self class isVariable
                        ifTrue: [self errorSubscriptBounds: index]
                        ifFalse: [self errorNotIndexable]].
        index isNumber
                ifTrue: [^self at: index asInteger]
                ifFalse: [self errorNonIntegerIndex]

thoughts comments?