[Cuis-dev] Enhancement proposal: Fail test when no assertion ran

Andres Valloud ten at smallinteger.com
Tue Apr 16 13:17:24 PDT 2024


FYI, in 2011 the expert you mentioned gave a presentation in which, 
talking about lost ideas, cites Smalltalk's class level handlers and 
even gives an example that agrees with what I am saying as an example of 
doing things well.  See reference 26 here, starting at slide 30, and 
specifically slide 33 for a default handler that retries the operation 
that failed.

https://www.lirmm.fr/~dony/

On 4/16/24 7:56 AM, Hernán Wilkinson wrote:
> Hi Andres,
>   I appreciate your explanation on how the exception mechanism works, 
> but it was not really necessary 😉
>   I see that we do not agree on this...
>   I'd like to comment on some things you said:
> 
> "You have no idea what subclasses of Error exist in the system when such
> assertions / handlers block run.  You have no idea what code somebody
> put in defaultAction."
> 
>   The defaultAction does not also know the subclasses of Error when it 
> was written.
> 
> "But now on: Error do: [...] breaks that functionality because explicit
> handlers stop default handlers from running"
> 
>   I think we have a different understanding of what defaultAction is. As 
> I understand it, it is a handler that is run if no other handler is 
> found. That is how Christophe Dony, an exceptions researcher and expert, 
> explains them also in the many papers he wrote.
>   So, based on that definition it is not a good idea to put in the 
> default action handling code that should always be executed. It is how 
> you explained above as step 2: 2.  "No on:do: handler.  Run the default 
> handler "
> 
> "What you are suggesting with that on: Error do: [...] business is to
> always stop looking for handlers between steps 1 and 2, and to
> substitute steps 2-5 with a universal handler that somehow will know how
> to handle everything."
> 
>   No, I've never suggested that.
> 
> Have a nice day,
> Hernan.
> 
> 
> 
> On Mon, Apr 15, 2024 at 10:11 PM Andres Valloud <ten at smallinteger.com 
> <mailto:ten at smallinteger.com>> wrote:
> 
>     Moreover, I'm sure you know this, but let's make sure exception
>     handling
>     is clear.  Here's how the handler of an exception is chosen.
> 
>     1.  Find an on:do: for the exception in question.  If there is one,
>     evaluate the associated block.
> 
>     2.  No on:do: handler.  Run the default handler of the exception in
>     question by sending defaultAction to the exception.
> 
>     3.  Let's say you have no refined defaultAction, now you get the
>     default
>     defaultAction, which for errors is typically to resignal as an
>     unhandled
>     exception.
> 
>     4.  Ok, start over.  Find an on:do: for the unhandled exception.  If
>     there is one, evaluate the block.
> 
>     5.  No on:do: handler for the unhandled exception.  Run the default
>     handler of the unhandled exception.  In most cases, this means "stop,
>     open a debugger".
> 
>     (Of course all steps can also send pass, retry, return, return:,
>     resignalAs:, etc)
> 
> 
>     What you are suggesting with that on: Error do: [...] business is to
>     always stop looking for handlers between steps 1 and 2, and to
>     substitute steps 2-5 with a universal handler that somehow will know
>     how
>     to handle everything.  Obviously this is not going to work.  What
>     happens if somebody added critical code to defaultAction at step 3?
>     Well, you just broke their code.
> 
>     This is why the vast majority of
> 
>              on: Error do: [...]
> 
>     should be
> 
>              on: UnhandledException do: [...]
> 
>     instead.
> 
>     Andres.
> 
>     On 4/15/24 5:52 PM, Andres Valloud via Cuis-dev wrote:
>      >> If so, I agree with you, that is why you can have a block as a
>      >> handling condition and that is also why when testing for exceptions
>      >> there should be an assertion to check that the right assertion was
>      >> signaled (for example checking the message of the exception).
>      >
>      > You say you agree, then immediately reach the same conclusions as
>     before.
>      >
>      > 1.  No [:ex | ] handler block can substitute for default handlers
>     whose
>      > job may be to handle the exception in question for you.  So, blanket
>      > assertions like on: Error do: [fail the test] are wrong.
>      >
>      > You have no idea what subclasses of Error exist in the system
>     when such
>      > assertions / handlers block run.  You have no idea what code
>     somebody
>      > put in defaultAction.
>      >
>      >> As a rule of thumb, I create new types of exceptions if there is a
>      >> handling condition for it, if not I reuse existing exception types.
>      >
>      > Again, you do not know what code is in defaultAction.  Blanket
>      > interpreting every occurrence of Error as fatal is just wrong.
>      >
>      > 2.  Consider modeling the well known Unix error EAGAIN as an
>     exception.
>      > This is an error, so you create e.g. UnixEAGAIN.  The default
>     reaction
>      > to the EAGAIN error is to try the operation again.  So, you put
>     in code
>      > in UnixEAGAIN>>defaultAction to retry, because that's what the
>     manual
>      > says.  You type this handling code only once, because *of course*
>     you do
>      > not want to copy paste that everywhere with explicit on:do:
>     handlers,
>      > and that's it.
>      >
>      > But now on: Error do: [...] breaks that functionality because
>     explicit
>      > handlers stop default handlers from running.
>      >
>      > There is no way to account for unknown exceptions and default
>     handlers
>      > that may not have been written yet, or of which you know nothing
>     about.
>      >
>      > Andres.
> 
> 
> 
> -- 
> *Hernán Wilkinson
> Agile Software Development, Teaching & Coaching*
> *Phone: +54-011*-4893-2057
> *Twitter: @HernanWilkinson*
> *site: http://www.10Pines.com <http://www.10pines.com/>*
> Address: Alem 896, Floor 6, Buenos Aires, Argentina


More information about the Cuis-dev mailing list