Ignoring timeouts in Drakma

Luís Oliveira luismbo at gmail.com
Wed Jun 12 23:19:56 UTC 2013

On Wed, Jun 12, 2013 at 11:23 PM, Patrick May <patrick.may at mac.com> wrote:
>> (defun try-request-from-multiple-urls (&rest urls)
>>   (loop
>>     (with-simple-restart (try-next "Try next URL")
>>       (handler-case
>>           (let ((url (first urls)))
>>             (format t "requesting ~A~%" url)
>>             (return (drakma:http-request url)))
>>         (usocket:timeout-error ()
>>           (setf urls (rest urls))
>>           (unless urls
>>             (format t "no more urls, returning~%")
>>             (return))
>>           (format t "timeout, trying next url~%")
>>           (invoke-restart 'try-next))))))
>> Tune as desired.  If you want to have the last timeout error percolate to the caller, you'll want handler-bind instead.
>         Thanks, Hans (and Drew C).  I figured out my problem on the train home (debugging by public embarrassment), but your use of with-simple-restart makes the code more understandable so I'll incorporate that.

Restarts are nice, but usually for communicating with other call
sites. Seems a bit overkill here. If I understand your problem, all
you need is handler-case really.

(defun poll-urls (urls)
  (dolist (url urls)
    (handler-case (drakma:http-request url)
      (usocket:timeout-error ()
        (format t "got timeout getting ~A~%" url)))))


Luís Oliveira

More information about the Drakma-devel mailing list