[racket] tcp-read handlers

From: Matthias Felleisen (matthias at ccs.neu.edu)
Date: Mon Jan 20 10:05:29 EST 2014

Of course. Where can you wait for the thread? You need a channel to communicate the exn out. 


On Jan 20, 2014, at 7:16 AM, Eduardo Bellani <ebellani at gmail.com> wrote:

> -----BEGIN PGP SIGNED MESSAGE-----
> Hash: SHA1
> 
> Nops Matthias, I' afraid this did not work, since this function
> returns immediatly.
> 
> 
> 
> On 01/18/2014 08:11 PM, Matthias Felleisen wrote:
>> 
>> If you can modify url.rkt for now, try something like this
>> [untested]
>> 
>> ;; url.rkt (define (purify-http-port in-port) (define-values
>> (in-pipe out-pipe) (make-pipe)) (define exn-raised #f) (thread (λ
>> () (with-handlers ((exn? (lambda (e) (set! exn-raised e)))) ;; do
>> choose the exn you really wish to catch (define status
>> (http-read-status in-port)) (define chunked? (http-read-headers
>> in-port)) (http-pipe-data chunked? in-port out-pipe) 
>> (close-input-port in-port)))) (or exn-raised in-pipe))
>> 
>> 
>> 
>> 
>> 
>> On Jan 18, 2014, at 5:08 PM, Eduardo Bellani wrote:
>> 
>> Btw, forgot to ask, any alternatives that could solve my problem
>> in the short term?
>> 
>> Again, thanks for the attention.
>> 
>> On 01/18/2014 02:18 PM, Matthias Felleisen wrote:
>>>>> 
>>>>> To supplement Matthew's response, see exn style:
>>>>> 
>>>>> http://plt.eecs.northwestern.edu/snapshots/current/doc/style/Choosing_the_Right_Construct.html#%28part._.Exceptions%29
>>>>> 
>>>>> 
>>>>> 
> This does not address the problem part.
>>>>> 
>>>>> On Jan 18, 2014, at 11:04 AM, Matthew Flatt wrote:
>>>>> 
>>>>>> The `exn?` predicate would catch all exceptions from the
>>>>>> base libraries.[*]
>>>>>> 
>>>>>> I think the problem may be that the underlying TCP port is
>>>>>> read in a separate decoding thread, and so the exception
>>>>>> and printing happens in that thread. If I'm right, then
>>>>>> that seems like a flaw in our implementation of decoding.
>>>>>> 
>>>>>> [*] To avoid interfering with the `exn:break?` exceptions 
>>>>>> triggered by Ctl-C, you almost always want `exn:fail?`
>>>>>> instead of just `exn?`.
>>>>>> 
>>>>>> At Sat, 18 Jan 2014 09:50:15 -0200, Eduardo Bellani wrote:
>>>>> Is there a way to install a handler for the tcp-error
>>>>> exception? I have a function like this
>>>>> 
>>>>> (define (get-page link-url (max-tries 5)) (let loop
>>>>> ([current-try 0]) (with-handlers ([exn? (? (e) (if (>
>>>>> current-try max-tries) (error 'get-page "failed because it
>>>>> exceeded ~a tries" max-tries) (begin (sleep 2) (loop (add1
>>>>> current-try)))))]) (get-pure-port link-url))))
>>>>> 
>>>>> that I'm using to crawl some data, but sometimes it's
>>>>> printing:
>>>>> 
>>>>> tcp-read: error reading system error: Connection reset by
>>>>> peer; errno=104 context...:
>>>>> /usr/racket/collects/net/url.rkt:392:3
>>>>> 
>>>>> Thanks for the attention.
>>>>> 
>>>>>>> ____________________ Racket Users list: 
>>>>>>> http://lists.racket-lang.org/users
>>>>>> ____________________ Racket Users list: 
>>>>>> http://lists.racket-lang.org/users
>>>>> 
>> 
>> 
> 
> -----BEGIN PGP SIGNATURE-----
> Version: GnuPG v1.4.14 (GNU/Linux)
> Comment: Using GnuPG with Thunderbird - http://www.enigmail.net/
> 
> iEYEARECAAYFAlLdE3gACgkQSbLl0kCTjGkbVACfUnth2k7258RtRDWeGrh9jnda
> FW0AmgI6CmyaUCBo7HnG2cbqVq4/NHsL
> =cyEp
> -----END PGP SIGNATURE-----



Posted on the users mailing list.