<div dir="ltr">Hi Mariano,<div> interesting! Lisp and Smalltalk are the only programming languages I know that do not destroy the stack when an exception is signaled and therefore allows you to do these kinds of things, go back in the stack and see the context where the exception was signaled, etc etc.</div><div> Regarding this idea, it looks to me that the responsibility of what to do with an exception should be in who is handling it, not who is signaling it. I mean, the same exception could be handled differently depending on the context... What do you think about it? Because to me this solution could generate more coupling that necessary.</div><div><br></div><div>Cheers!</div><div>Hernan.</div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Sat, Jun 24, 2023 at 12:00 AM Mariano Montone via Cuis-dev <<a href="mailto:cuis-dev@lists.cuis.st">cuis-dev@lists.cuis.st</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">Hello,<br>
<br>
Inspired by the Common Lisp exception system, I've implemented a <br>
somewhat equivalent exception resumable system for Cuis, as an <br>
experiment, that I've called MultiResumableExceptions.<br>
<br>
A MultiResumableError is a subclass of Error that accepts multiple <br>
"cases" for resuming its execution. It provides multiple ways of <br>
resuming the exception.<br>
<br>
The way to resume the exception is decided by the exception handler <br>
code, or, if the exception is not handled, interactively by the user by <br>
selecting the way to continue from a user interface menu.<br>
<br>
So, a simple example is the handling of FileNotFound kind of exceptions: <br>
when a file is not found, one may want to create, overwrite, or even use <br>
a different filename, depending on the operation.<br>
<br>
In the following example, a MultiResumableError is signaled with two <br>
"resume cases" attached, one for retrying the operation, and another for <br>
trying with a different file name:<br>
<br>
<source><br>
<br>
| fileName fileEntry |<br>
<br>
fileName := 'something.log'.<br>
fileEntry := fileName asFileEntry.<br>
<br>
[fileEntry exists]<br>
     whileFalse: [<br>
         MultiResumableError new "Should use a proper subclass of <br>
MultiResumableError instead."<br>
             messageText: 'File does not exist';<br>
             case: 'retry' do: [];<br>
             case: 'use other file name' do: [:newFileName |<br>
                         newFileName ifNotNil: [fileName := newFileName. <br>
fileEntry := fileName asFileEntry]]<br>
                       interactor: [FillInTheBlankMorph request: 'Text <br>
for the file:' initialAnswer: fileName];<br>
             signal].<br>
<br>
fileEntry textContents edit<br>
<br>
</source><br>
<br>
If the file is not found, the user is presented with a menu from where <br>
he can choose either to retry or use other file name.<br>
<br>
While what MultiResumableError does is already possible to implement in <br>
Cuis using Exception>>defaultAction, this takes a slightly different <br>
approach:<br>
<br>
- The signaler of the exception does not have to bother with creating UI <br>
menus; simply attaches "resume handlers" using #case:do: ; the user <br>
facing menu is built automatically if the exception is not handled.<br>
<br>
- The key insight that *how* an exception can be resumed belongs to the <br>
code that signals the exception, as the failing context is directly <br>
available there for the handlers in charge of resuming the exception; <br>
but  *what* to do, which of the ways of resuming the exception, should <br>
be decided by the exception handling code, at the upper levels, or <br>
interactively by the user it goes unhandled.<br>
<br>
This is a simple experiment, but it is also a very useful thing; letting <br>
the user react in different ways to an exceptional situation, without <br>
losing the current context. Could also be considered vital for very <br>
long-running jobs, where we want to prevent having to restart the whole <br>
process if one of the steps fail. This is something I'm thankful for <br>
when programming in Common Lisp.<br>
<br>
I hope you find this somewhat interesting. If you are curious, I invite <br>
you to load the attached code and have a look at the examples, and also <br>
read how Common Lisp exception system works: <br>
<a href="https://gigamonkeys.com/book/beyond-exception-handling-conditions-and-restarts.html" rel="noreferrer" target="_blank">https://gigamonkeys.com/book/beyond-exception-handling-conditions-and-restarts.html</a> <br>
. And also look at Exception>>defaultAction in Cuis, with which this is <br>
implemented and is quite interesting too.<br>
<br>
Cheers,<br>
<br>
     Mariano<br>
-- <br>
Cuis-dev mailing list<br>
<a href="mailto:Cuis-dev@lists.cuis.st" target="_blank">Cuis-dev@lists.cuis.st</a><br>
<a href="https://lists.cuis.st/mailman/listinfo/cuis-dev" rel="noreferrer" target="_blank">https://lists.cuis.st/mailman/listinfo/cuis-dev</a><br>
</blockquote></div><br clear="all"><div><br></div><span class="gmail_signature_prefix">-- </span><br><div dir="ltr" class="gmail_signature"><div dir="ltr"><div><div dir="ltr"><div style="font-size:small"><div dir="ltr"><div dir="ltr"><div style="font-size:12.8px"><span style="font-family:tahoma,sans-serif;font-size:xx-small;border-collapse:collapse"><strong><span style="font-size:8pt"><span style="font-size:small"><font size="2"><span style="font-weight:normal"><span style="font-weight:bold">Hernán Wilkinson</span><br>Agile Software Development, Teaching & Coaching</span></font></span></span></strong></span></div><div style="font-size:12.8px"><span style="font-family:tahoma,sans-serif;font-size:xx-small;border-collapse:collapse"><strong><span style="font-size:8pt"><span style="font-size:small"><font size="2"><span style="font-weight:normal">Phone: +54-011</span></font></span></span></strong></span><font face="tahoma, sans-serif" size="2">-4893-2057</font></div><div style="font-size:12.8px"><strong style="font-family:tahoma,sans-serif;font-size:xx-small"><span style="font-size:8pt"><span style="font-size:small"><font size="2"><span style="font-weight:normal">Twitter: @HernanWilkinson</span></font></span></span></strong></div><div style="font-size:12.8px"><span style="font-family:tahoma,sans-serif;font-size:xx-small;border-collapse:collapse"><strong><span style="font-size:8pt"><span style="font-size:small"><font size="2"><span style="font-weight:normal">site: <a href="http://www.10pines.com/" style="color:rgb(17,65,112)" target="_blank">http://www.10Pines.com</a></span></font></span></span></strong></span></div><div style="font-size:12.8px"><font face="tahoma, sans-serif"><span style="border-collapse:collapse">Address: Alem 896</span></font>, Floor 6, Buenos Aires, Argentina</div></div></div></div></div></div></div></div>