On Wed, May 4, 2016 at 1:14 PM, John Clements <[email protected]> wrote:
>
>> On May 4, 2016, at 9:59 AM, Sam Tobin-Hochstadt <[email protected]> wrote:
>>
>> That seems fine, but the general approach the handin-server is taking
>> seems wrong to me. If it wants an exception with a different message,
>> it should just create that, rather than assuming that all exception
>> structures are reasonable to modify.
>
> Well, I can certainly do both.
>
> In general, perhaps the right solution for the handin server would be
> to deliver an exn:fail:handin-server with an additional field
> containing the original exception. That way, no information is lost.
>
> The danger, of course, is that this might break code that depends on
> the exception satisfying some predicate (the filesystem and network
> exceptions are the ones that worry me). Perhaps Eli can comment on
> this?

TBH, I have no memory of this -- and looking at the code (I'm assuming
it's the `reraise` bit in `wrap-evaluator`??) I'm not sure that I wrote
it.

[...Doing some archaeological digging...]

OK, I think that the following is everything that I can say about it,
and let you judge what would be the best way to re-solve it.  I think
that the main thing that changed that you're talking about is Matthew's
comment that "All the built-in exn structs are fully transparent,
though".  Also, there's the motivation for doing this: "It's important
to keep the same exception, because ...".  (And both of these might be a
justification to make it transparent, or to fix it in a different way
that makes the "because" thing work, and maybe make a note of the lack
of transparency somewhere; I have no significant opinion about it.)

So -- assuming that function is the right place that you're talking
about, I see that this is code that I committed in:

  > commit fd858f081c564a3c94a682aee5896bc535fd9956
  > Author: Eli Barzilay <[email protected]>
  > Date:   2007-01-24 07:52:51 +0000
  >
  >     removed the tweaker hack for a solution that creates a new exception
  >
  >     svn: r5446

and it removes a simple hack that uses a `current-error-message-tweaker`
("tweaker" is surely mine...) and adds instead the code that assembles a
new exception.

I then did some more digging in my mail, and found this email exchange
between me and Matthew about this:

[Eli]
  > For some corner of the handin server I wanted to capture exceptions,
  > then reraise a modified version of the exception (basically turn any
  > exn to one that has "<same message> while evaluating <some expr>").
  > It's important to keep the same exception, because some tests rely
  > on it (like catching an `exn:fail:contract:variable?' when testing
  > for a bound identifier).
  >
  > Looks like `copy-struct' is not enough, because it wants a struct-id.
  > Is there some easy way to do that?  (I know that it's possible,
  > because I did similar stuff in reflecting mzscheme structs as swindle
  > classes, but I'm looking for a simple solution.)

[Matthew]
  > If you have a sufficiently powerful inspector, then `struct-info'
  > and `struct-type-info' let you do what you want, and that's the only
  > possibility that I see.

[Eli]
  > Does the code below look reasonable?  -- I'm using struct-info just
  > to make sure that struct->vector does return all the field values.
  > (I think that this code will break with auto fields, but it should
  > be fine with the exn hierarchy.)
  >
  >   (define ((make-chatty-eval eval) expr)
  >     (define (reraise exn)
  >       (raise
  >        (let-values ([(struct-type skipped?) (struct-info exn)])
  >          (if (and struct-type (not skipped?))
  >            (let ([vals (vector->list (struct->vector exn))])
  >              (apply (struct-type-make-constructor struct-type)
  >                     (string->immutable-string
  >                      (format "while evaluating ~s:\n  ~a" expr (cadr vals)))
  >                     (cddr vals)))
  >            e))))
  >     (with-handlers ([exn? reraise]) (eval expr)))

[Matthew]
  > Looks fine to me.
  >
  > I don't think the use of `struct-type' ensures that `struct->vector'
  > returns all the fields. The immediate struct could be transparentand
  > the next one opaque. All the built-in exn structs are fully
  > transparent, though.

[Eli]
  > OK -- so I thought that a proper solution would be to check the
  > chain up the all the way (and just mention that in a comment in case
  > someone uses this code), but then I realized that there is a much
  > simpler way: simply define a local unique value, hand that as the
  > second argument to struct->vector, and make sure that the unique
  > value is not a memq of the result.

-- 
                    ((x=>x(x))(x=>x(x)))                   Eli Barzilay:
                    http://barzilay.org/                   Maze is Life!

-- 
You received this message because you are subscribed to the Google Groups 
"Racket Users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Reply via email to