mirror of https://github.com/scrapy/scrapy.git
Undocument _InvalidOutput exception
This commit is contained in:
parent
4090cc3990
commit
9c256cf693
|
|
@ -62,17 +62,6 @@ remain disabled. Those components include:
|
|||
|
||||
The exception must be raised in the component's ``__init__`` method.
|
||||
|
||||
InvalidOutput
|
||||
-------------
|
||||
|
||||
.. exception:: InvalidOutput
|
||||
|
||||
This exception can be raised by a downloader or spider middleware to
|
||||
indicate that some method returned a value not suported by the processing
|
||||
chain.
|
||||
See :ref:`topics-spider-middleware` and :ref:`topics-downloader-middleware`
|
||||
for a list of supported output values.
|
||||
|
||||
NotSupported
|
||||
------------
|
||||
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@ See documentation in docs/topics/spider-middleware.rst
|
|||
"""
|
||||
import six
|
||||
from twisted.python.failure import Failure
|
||||
from scrapy.exceptions import InvalidOutput
|
||||
from scrapy.exceptions import _InvalidOutput
|
||||
from scrapy.middleware import MiddlewareManager
|
||||
from scrapy.utils.defer import mustbe_deferred
|
||||
from scrapy.utils.conf import build_component_list
|
||||
|
|
@ -42,7 +42,7 @@ class SpiderMiddlewareManager(MiddlewareManager):
|
|||
try:
|
||||
result = method(response=response, spider=spider)
|
||||
if result is not None:
|
||||
raise InvalidOutput('Middleware {} must return None or raise ' \
|
||||
raise _InvalidOutput('Middleware {} must return None or raise ' \
|
||||
'an exception, got {}'.format(fname(method), type(result)))
|
||||
except:
|
||||
return scrape_func(Failure(), request, spider)
|
||||
|
|
@ -50,13 +50,13 @@ class SpiderMiddlewareManager(MiddlewareManager):
|
|||
|
||||
def process_spider_exception(_failure):
|
||||
exception = _failure.value
|
||||
# don't handle InvalidOutput exception
|
||||
if isinstance(exception, InvalidOutput):
|
||||
# don't handle _InvalidOutput exception
|
||||
if isinstance(exception, _InvalidOutput):
|
||||
return _failure
|
||||
for method in self.methods['process_spider_exception']:
|
||||
result = method(response=response, exception=exception, spider=spider)
|
||||
if result is not None and not _isiterable(result):
|
||||
raise InvalidOutput('Middleware {} must return None or an iterable ' \
|
||||
raise _InvalidOutput('Middleware {} must return None or an iterable ' \
|
||||
'object, got {}'.format(fname(method), type(result)))
|
||||
# stop exception handling by handing control over to the
|
||||
# process_spider_output chain if an iterable has been returned
|
||||
|
|
@ -80,7 +80,7 @@ class SpiderMiddlewareManager(MiddlewareManager):
|
|||
if _isiterable(result):
|
||||
result = wrapper(result)
|
||||
else:
|
||||
raise InvalidOutput('Middleware {} must return an iterable object, ' \
|
||||
raise _InvalidOutput('Middleware {} must return an iterable object, ' \
|
||||
'got {}'.format(fname(method), type(result)))
|
||||
return result
|
||||
|
||||
|
|
|
|||
|
|
@ -11,9 +11,11 @@ class NotConfigured(Exception):
|
|||
"""Indicates a missing configuration situation"""
|
||||
pass
|
||||
|
||||
class InvalidOutput(TypeError):
|
||||
"""Indicates an invalid value has been returned
|
||||
by a middleware's processing method"""
|
||||
class _InvalidOutput(TypeError):
|
||||
"""
|
||||
Indicates an invalid value has been returned by a middleware's processing method.
|
||||
Internal and undocumented, it should not be raised or caught by user code.
|
||||
"""
|
||||
pass
|
||||
|
||||
# HTTP and crawling
|
||||
|
|
|
|||
|
|
@ -159,7 +159,7 @@ class DoSomethingMiddleware(object):
|
|||
|
||||
|
||||
# ================================================================================
|
||||
# don't catch InvalidOutput from scrapy's spider middleware manager
|
||||
# don't catch _InvalidOutput from scrapy's spider middleware manager
|
||||
class InvalidReturnValueFromPreviousMiddlewareInputSpider(LocalhostSpider):
|
||||
name = 'invalid_return_value_from_previous_middleware_input'
|
||||
custom_settings = {
|
||||
|
|
@ -318,19 +318,19 @@ class TestSpiderMiddleware(TestCase):
|
|||
|
||||
@defer.inlineCallbacks
|
||||
def test_process_spider_exception_invalid_return_value_previous_middleware(self):
|
||||
""" don't catch InvalidOutput from middleware """
|
||||
""" don't catch _InvalidOutput from middleware """
|
||||
# on middleware's input
|
||||
crawler1 = get_crawler(InvalidReturnValueFromPreviousMiddlewareInputSpider)
|
||||
with LogCapture() as log1:
|
||||
yield crawler1.crawl()
|
||||
self.assertNotIn("InvalidOutput exception caught", str(log1))
|
||||
self.assertIn("'spider_exceptions/InvalidOutput'", str(log1))
|
||||
self.assertNotIn("_InvalidOutput exception caught", str(log1))
|
||||
self.assertIn("'spider_exceptions/_InvalidOutput'", str(log1))
|
||||
# on middleware's output
|
||||
crawler2 = get_crawler(InvalidReturnValueFromPreviousMiddlewareOutputSpider)
|
||||
with LogCapture() as log2:
|
||||
yield crawler2.crawl()
|
||||
self.assertNotIn("InvalidOutput exception caught", str(log2))
|
||||
self.assertIn("'spider_exceptions/InvalidOutput'", str(log2))
|
||||
self.assertNotIn("_InvalidOutput exception caught", str(log2))
|
||||
self.assertIn("'spider_exceptions/_InvalidOutput'", str(log2))
|
||||
|
||||
@defer.inlineCallbacks
|
||||
def test_process_spider_exception_execution_chain(self):
|
||||
|
|
|
|||
Loading…
Reference in New Issue