The error is because type signature of `raise` doesn't allow
"non-flat" values like functions and mutable vectors.

It might not be safe to allow `(raise (vector 1 2 3))` in Typed Racket
... I'm not sure.

For now I think you should make a new exception type. Example:

```
#lang typed/racket/base

(define-type Packable (U Byte (Vectorof Packable)))

(struct exn:fail:rpc exn ((val : Packable)))

(with-handlers ((exn:fail:rpc? exn:fail:rpc-val))
  (raise (exn:fail:rpc "oops" (current-continuation-marks) (vector 1 2 3))))
```

On Fri, Dec 1, 2017 at 9:05 AM, HiPhish <hiph...@openmailbox.org> wrote:
> Hello Racketeers,
>
> I have been trying to port a module over to Typed Racket, and I have almost
> succeeded except for one issue: raising an arbitrary object as an error.
> Compare the following code:
>
>     ;; Works fine
>     (raise 3)
>
>     ;; Does not work
>     (raise (vector 1 2 3))
>
> The error I get is
>     ; nvim-client/client.rkt:244:55: Type Checker: No function domains
> matched in
>     ;   function application:
>     ; Domains: (U (Rec flat (U (Pairof flat flat) Boolean Char Complex
> Keyword Null
>     ;   String Symbol)) exn) Any
>     ;          (U (Rec flat (U (Pairof flat flat) Boolean Char Complex
> Keyword Null
>     ;            String Symbol)) exn)
>     ; Arguments: (U (Immutable-HashTable Packable Packable)
> (Mutable-HashTable
>     ;   Packable Packable) (Pairof Packable (Listof Packable))
> (Weak-HashTable
>     ;   Packable Packable) Boolean Bytes Ext Message-Args Null Real String)
>     ;   in: (raise error)
>     ; [,bt for context]
>
> So I looked up the signature of `raise` and I get this:
>
>     > raise
>     - : (->* ((U (Rec
>                   flat
>                   (U (Pairof flat flat)
>                      Boolean
>                      Char
>                      Complex
>                      Keyword
>                      Null
>                      String
>                      Symbol))
>                  exn))
>              (Any)
>              (Nothing : (Bot | Bot)))
>     #<procedure:raise>
>
> So what does this mean and what should I do? I am porting a module from my
> Neovim client which uses the MessagePack-RPC protocol, and part of the
> protocol
> is that any object that can be packed can be raised as an error.
> https://github.com/msgpack-rpc/msgpack-rpc/blob/master/spec.md#error
>
> Raising any object as an error would have allowed someone making an RPC
> request
> to just do something like this:
>
>     (with-handlers ([packable? (λ (exn) (display exn))])
>       (rpc-request "foo" '#(bar)))
>
> What should I do instead? Create a new error type like `exn:fail:rpc`? Or am
> I
> missing something here?
>
> --
> 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 racket-users+unsubscr...@googlegroups.com.
> 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 racket-users+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to