"""
Scrapy core exceptions
These exceptions are documented in docs/topics/exceptions.rst. Please don't add
new exceptions here without documenting them there.
"""
from __future__ import annotations
from typing import TYPE_CHECKING, Any
if TYPE_CHECKING:
from scrapy.http import Response
# Internal
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.
"""
# HTTP and crawling
[docs]
class IgnoreRequest(Exception):
"""Raised to indicate that a request should be ignored.
A :ref:`downloader middleware <topics-downloader-middleware>` can raise it
from its
:meth:`~scrapy.downloadermiddlewares.DownloaderMiddleware.process_request`
or
:meth:`~scrapy.downloadermiddlewares.DownloaderMiddleware.process_response`
method to drop a request, and a :signal:`request_scheduled` signal handler
can raise it to drop a request before it reaches the
:ref:`scheduler <topics-scheduler>`."""
[docs]
class DontCloseSpider(Exception):
"""Raised in a :signal:`spider_idle` signal handler to prevent the spider
from being closed."""
[docs]
class CloseSpider(Exception):
"""Raised from a :ref:`spider callback <topics-spiders>` to request the
spider to be closed/stopped.
*reason* is a string with the reason for closing.
For example:
.. code-block:: python
def parse_page(self, response):
if "Bandwidth exceeded" in response.text:
raise CloseSpider("bandwidth_exceeded")
"""
def __init__(self, reason: str = "cancelled"):
super().__init__()
self.reason = reason
[docs]
class StopDownload(Exception):
"""Raised from a :class:`~scrapy.signals.bytes_received` or
:class:`~scrapy.signals.headers_received` signal handler to :ref:`stop the
download <topics-stop-response-download>` of the response body.
The ``fail`` boolean parameter controls which method will handle the
resulting response:
* If ``fail=True`` (default), the request errback is called. The response
object is available as the ``response`` attribute of the ``StopDownload``
exception, which is in turn stored as the ``value`` attribute of the
received :class:`~twisted.python.failure.Failure` object. This means that
in an errback defined as ``def errback(self, failure)``, the response can
be accessed though ``failure.value.response``.
* If ``fail=False``, the request callback is called instead.
In both cases, the response could have its body truncated: the body contains
all bytes received up until the exception is raised, including the bytes
received in the signal handler that raises the exception. Also, the response
object is marked with ``"download_stopped"`` in its
:attr:`~scrapy.http.Response.flags` attribute.
"""
response: Response | None
def __init__(self, *, fail: bool = True):
super().__init__()
self.fail = fail
[docs]
class DownloadConnectionRefusedError(Exception):
"""Indicates that a connection was refused by the server."""
[docs]
class CannotResolveHostError(Exception):
"""Indicates that the provided hostname cannot be resolved."""
[docs]
class DownloadTimeoutError(Exception):
"""Indicates that a request download has timed out."""
[docs]
class DownloadCancelledError(Exception):
"""Indicates that a request download was cancelled."""
[docs]
class DownloadFailedError(Exception):
"""Indicates that a request download has failed."""
[docs]
class ResponseDataLossError(Exception):
"""Indicates that Scrapy couldn't get a complete response."""
[docs]
class UnsupportedURLSchemeError(Exception):
"""Indicates that the URL scheme is not supported."""
# Items
[docs]
class DropItem(Exception):
"""Raised from the :meth:`process_item` method of an :ref:`item pipeline
<topics-item-pipeline>` to stop the processing of an item."""
def __init__(self, message: str, log_level: str | None = None):
super().__init__(message)
self.log_level = log_level
[docs]
class NotSupported(Exception):
"""Raised to indicate that a requested feature is not supported.
For example, Scrapy raises it when text-parsing shortcuts such as
:meth:`response.css() <scrapy.http.TextResponse.css>` or
:meth:`response.xpath() <scrapy.http.TextResponse.xpath>` are used on a
:class:`~scrapy.http.Response` whose content is not text, or when sending a
request whose URL scheme has no matching :ref:`download handler
<topics-download-handlers>`."""
# Commands
class UsageError(Exception):
"""To indicate a command-line usage error"""
def __init__(self, *a: Any, **kw: Any):
self.print_help = kw.pop("print_help", True)
super().__init__(*a, **kw)
class ScrapyDeprecationWarning(Warning):
"""Warning category for deprecated features, since the default
:exc:`DeprecationWarning` is silenced.
"""
[docs]
class ContractFail(AssertionError):
"""Error raised in case of a failing contract"""