Source code for boxsdk.exception
# coding: utf-8
from __future__ import unicode_literals
import attr
from .network.network_interface import NetworkResponse
from .util.log import sanitize_dictionary
[docs]class BoxException(Exception):
"""
Base class exception for all errors raised from the SDK.
"""
def __str__(self):
return '{}'.format(self.__class__.__name__)
def __repr__(self):
return '<{}>'.format(self.__class__.__name__)
[docs]class BoxNetworkException(BoxException):
"""
Exception raised from the network layer.
"""
pass
[docs]@attr.s(repr=True, slots=True, frozen=True)
class BoxAPIException(BoxException):
"""
Exception raised from the box session layer.
:param status:
HTTP status code of the failed response
:type status:
`int`
:param code:
The 'code' field of the failed response
:type code:
`unicode` or None
:param message:
A message to associate with the exception, e.g. 'message' field of the json in the failed response
:type message:
`unicode` or None
:param request_id:
The 'request_id' field of the json in the failed response
:type request_id:
`unicode` or None
:param headers:
The HTTP headers in the failed response
:type headers:
`dict`
:param url:
The url which raised the exception
:type url:
`unicode`
:param method:
The HTTP verb used to make the request.
:type method:
`unicode`
:param context_info:
The context_info returned in the failed response.
:type context_info:
`dict` or None
:param network_response:
The failed response
:type network_response:
Requests `Response`
"""
status = attr.ib()
code = attr.ib(default=None)
message = attr.ib(default=None)
request_id = attr.ib(default=None)
headers = attr.ib(default=None, hash=False)
url = attr.ib(default=None)
method = attr.ib(default=None)
context_info = attr.ib(default=None)
network_response = attr.ib(default=None, repr=False)
def __str__(self):
return '\n'.join((
'Message: {self.message}',
'Status: {self.status}',
'Code: {self.code}',
'Request ID: {self.request_id}',
'Headers: {headers}',
'URL: {self.url}',
'Method: {self.method}',
'Context Info: {self.context_info}',
)).format(self=self, headers=sanitize_dictionary(self.headers))
[docs]@attr.s(repr=True, slots=True, frozen=True)
class BoxOAuthException(BoxException):
"""
Exception raised during auth.
:param status:
HTTP status code of the auth response
:type status:
`int`
:param message:
A message to associate with the exception, e.g. HTTP content of the auth response
:type message:
`unicode`
:param url:
The url which raised the exception
:type url:
`unicode`
:param method:
The HTTP verb used to make the request.
:type method:
`unicode`
:param network_response:
The network response for the request.
:type network_response:
:class:`NetworkResponse`
:param code:
The 'code' field of the failed response
:type code:
`unicode` or None
"""
status = attr.ib()
message = attr.ib(default=None)
url = attr.ib(default=None)
method = attr.ib(default=None)
network_response = attr.ib(default=None, repr=False, type=NetworkResponse)
code = attr.ib(default=None)
def __str__(self):
# pylint:disable=no-member
if self.network_response:
headers = sanitize_dictionary(self.network_response.headers)
# pylint:enable=no-member
else:
headers = 'N/A'
return '\nMessage: {0}\nStatus: {1}\nURL: {2}\nMethod: {3}\nHeaders: {4}'.format(
self.message,
self.status,
self.url,
self.method,
headers,
)
__all__ = list(map(str, ['BoxException', 'BoxAPIException', 'BoxOAuthException', 'BoxNetworkException']))