como processar todos os tipos de exceção em um projeto escasso, em errback e callback?

No momento, estou trabalhando em um projeto de raspador que é muito importante para garantir que TODAS as solicitações sejam tratadas adequadamente, ou seja, para registrar um erro ou para salvar um resultado bem-sucedido. Eu já implementei o spider básico, e agora posso processar 99% dos pedidos com sucesso, mas posso obter erros como captcha, 50x, 30x, ou até mesmo não há campos suficientes no resultado (então tentarei outro site para encontrar os campos que faltam).

No começo, achei mais "lógico" levantar exceções no callback de análise e processá-las em errback, o que poderia tornar o código mais legível. Mas eu tentei apenas descobrir que o errback só pode capturar erros no módulo do downloader, como status de resposta não-200. Se eu levantar um ParseError auto-implementado no retorno de chamada, a aranha apenas aumenta e pára.

Mesmo que eu tenha que processar a solicitação de análise diretamente no retorno de chamada, não sei como repetir a solicitação imediatamente no retorno de chamada de maneira limpa. Você sabe, eu posso ter que incluir um proxy diferente para enviar outro pedido ou modificar algum cabeçalho de solicitação.

Eu admito que sou relativamente novo para ser escravo, mas eu tentei durante vários dias e ainda não consigo fazer com que isso funcione ... Eu verifiquei todas as perguntas sobre SO e ninguém combina, obrigado antecipadamente pela ajuda.

UPDATE: Eu percebo que esta poderia ser uma questão muito complexa, então eu tento ilustrar o cenário no seguinte pseudo código, espero que isso ajude:

from scraper.myexceptions import *

def parseRound1(self, response):

    .... some parsing routines ...
    if something wrong happened:
       # this causes the spider raises a SpiderException and stops
       raise CaptchaError
    ...

    if no enough fields scraped:
       raise ParseError(task, "no enough fields")
    else:
       return items

def parseRound2(self, response):
    ...some other parsing routines...

def errHandler(self, failure):
    # how to trap all the exceptions?
    r = failure.trap()
    # cannot trap ParseError here
    if r == CaptchaError:
       # how to enqueue the original request here?
       retry
    elif r == ParseError:
        if raised from parseRound1:
            new request for Round2
        else:
            some other retry mechanism
    elif r == HTTPError:
       ignore or retry

questionAnswers(2)

yourAnswerToTheQuestion