On Wed, May 4, 2016 at 1:14 PM, 'John Clements' via Racket Users <[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?
Right, something like that was my thought. Who ends up consuming these exceptions, other than the printer? Sam > > John > >> >> Sam >> >> On Wed, May 4, 2016, 12:52 PM 'John Clements' via Racket Users >> <[email protected]> wrote: >> Bump. >> >> Okay if I make a pull request to make ‘match’ exceptions transparent? I see >> that all of the ones listed in 10.2.5 are transparent. >> >> John >> >> > On Apr 27, 2016, at 3:08 PM, John Clements <[email protected]> >> > wrote: >> > >> > >> >> On Apr 27, 2016, at 3:01 PM, Sam Tobin-Hochstadt <[email protected]> >> >> wrote: >> >> >> >> The exceptions raised by `match` are indeed not transparent. But I >> >> don't understand why they need to be in order for the handin server to >> >> handle them properly. >> > >> > (caveat: this is my reading of the code below) >> > >> > The handin server wants to add information to the exn-message part, in >> > order to indicate what handin test triggered the error. >> > >> > Doing this involves converting the exception to a vector, adding text to >> > the message part, and then reassembling and re-raising the error. The code >> > below therefore bails out when either “skipped?” turns out to be true or >> > when one or when struct->vector produces a vector with opaque fields. >> > >> > This doesn’t appear to be a problem for any of the other exceptions that >> > the handin server encounters (well, this is the first time I’ve seen this >> > problem, anyhow). >> > >> > I can hack the handin server to treat match exceptions specially, but that >> > definitely doesn’t seem like the right solution. >> > >> > John >> > >> > >> > >> > >> > (define ((wrap-evaluator eval) expr) >> > (define unknown "unknown") >> > (define (reraise exn) >> > (raise >> > (let-values ([(struct-type skipped?) (struct-info exn)]) >> > (if (and struct-type (not skipped?)) >> > (let ([vals (cdr (vector->list (struct->vector exn unknown)))]) >> > (if (memq unknown vals) >> > exn >> > (apply (struct-type-make-constructor struct-type) >> > (format "while evaluating ~s:\n ~a" expr (car vals)) >> > (cdr vals)))) >> > exn)))) >> > (with-handlers ([exn? reraise]) (eval expr))) >> > >> >> >> >> Sam >> >> >> >> On Wed, Apr 27, 2016 at 5:58 PM, 'John Clements' via Racket Users >> >> <[email protected]> wrote: >> >>> >> >>>> On Apr 22, 2016, at 1:47 PM, 'John Clements' via Racket Users >> >>>> <[email protected]> wrote: >> >>>> >> >>>> Currently, the handin-server runs student expressions in an ‘eval’ >> >>>> which intercepts errors and re-raises them with a message that includes >> >>>> the failing expression. All good. >> >>>> >> >>>> However, it doesn’t catch all of them. Specifically, if the exception >> >>>> contains any values that are opaque to struct->vector, it gives up and >> >>>> re-raises the exception as-is. >> >>>> >> >>>> This turns out to cause a problem with “match” failures, which include >> >>>> such values. This causes a problem for my students, because they’re >> >>>> unable to see the text of the test cases that they failed. >> >>>> >> >>>> It’s easy enough to hack around this in my code by re-wording ‘match’ >> >>>> failures in the same way that wrap-evaluator does. In general, though, >> >>>> it seems like there’s no good reason that ‘match’ failures shouldn’t go >> >>>> into the same bin as division by zero, applying a non-function, and all >> >>>> of the other things that can go wrong during evaluation. >> >>>> >> >>>> In order to fix this, then, I’m trying to determine why this check >> >>>> exists: what exceptions do you *not* want to re-word here? >> >>> >> >>> Okay, answering my own question and asking another: >> >>> >> >>> The fundamental reason for the existence of this logic is that the >> >>> handin-engine is trying to be careful, and modify exceptions that can >> >>> safely be reconstructed. If the “skipped” value is #t, or if one or more >> >>> of the values in the structure are opaque, this is impossible. At this >> >>> point, the handin engine just throws up its hands and decides to follow >> >>> the hippocratic oath, “first do no harm,” and let the exception continue >> >>> as is. >> >>> >> >>> So, this leads to a different question: *why* is the match exception >> >>> different from all the other exceptions? Based on my reading of the >> >>> struct-info documentation, it appears that the ‘match’ form constructs >> >>> exceptions whose inspector is not the current one, or perhaps that it >> >>> fails to declare itself as transparent. >> >>> >> >>> My guess is that this is just an oversight, and that a ‘match’ exception >> >>> should be just as transparent as, say, a division by zero exception. >> >>> Here’s code that illustrates the difference: >> >>> >> >>> #lang racket >> >>> >> >>> (with-handlers ([exn:fail? >> >>> (λ (exn) >> >>> (struct-info exn))]) >> >>> (/ 1 0)) >> >>> >> >>> (with-handlers ([exn:fail? >> >>> (λ (exn) >> >>> (struct-info exn))]) >> >>> (match 13 >> >>> ['a 4])) >> >>> >> >>> So, here’s my question: >> >>> >> >>> Is there a good reason for the difference between the `match` exception >> >>> (skipped is #t) and the division-by-zero exception (skipped is #f) ? >> >>> >> >>> John >> >>> >> >>> >> >>> >> >>> >> >>> -- >> >>> 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. >> > >> >> >> >> -- >> 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. > > > > -- > 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. -- 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.

