83 lines
2.8 KiB
Python
83 lines
2.8 KiB
Python
# -*- coding: utf-8 -*-
|
|
import sys
|
|
from typing import Optional
|
|
|
|
|
|
class TwilioException(Exception):
|
|
pass
|
|
|
|
|
|
class TwilioRestException(TwilioException):
|
|
"""A generic 400 or 500 level exception from the Twilio API
|
|
|
|
:param int status: the HTTP status that was returned for the exception
|
|
:param str uri: The URI that caused the exception
|
|
:param str msg: A human-readable message for the error
|
|
:param int|None code: A Twilio-specific error code for the error. This is
|
|
not available for all errors.
|
|
:param method: The HTTP method used to make the request
|
|
:param details: Additional error details returned for the exception
|
|
"""
|
|
|
|
def __init__(
|
|
self,
|
|
status: int,
|
|
uri: str,
|
|
msg: str = "",
|
|
code: Optional[int] = None,
|
|
method: str = "GET",
|
|
details: Optional[object] = None,
|
|
):
|
|
self.uri = uri
|
|
self.status = status
|
|
self.msg = msg
|
|
self.code = code
|
|
self.method = method
|
|
self.details = details
|
|
|
|
def __str__(self) -> str:
|
|
"""Try to pretty-print the exception, if this is going on screen."""
|
|
|
|
def red(words: str) -> str:
|
|
return "\033[31m\033[49m%s\033[0m" % words
|
|
|
|
def white(words: str) -> str:
|
|
return "\033[37m\033[49m%s\033[0m" % words
|
|
|
|
def blue(words: str) -> str:
|
|
return "\033[34m\033[49m%s\033[0m" % words
|
|
|
|
def teal(words: str) -> str:
|
|
return "\033[36m\033[49m%s\033[0m" % words
|
|
|
|
def get_uri(code: int) -> str:
|
|
return "https://www.twilio.com/docs/errors/{0}".format(code)
|
|
|
|
# If it makes sense to print a human readable error message, try to
|
|
# do it. The one problem is that someone might catch this error and
|
|
# try to display the message from it to an end user.
|
|
if hasattr(sys.stderr, "isatty") and sys.stderr.isatty():
|
|
msg = (
|
|
"\n{red_error} {request_was}\n\n{http_line}"
|
|
"\n\n{twilio_returned}\n\n{message}\n".format(
|
|
red_error=red("HTTP Error"),
|
|
request_was=white("Your request was:"),
|
|
http_line=teal("%s %s" % (self.method, self.uri)),
|
|
twilio_returned=white("Twilio returned the following information:"),
|
|
message=blue(str(self.msg)),
|
|
)
|
|
)
|
|
if self.code:
|
|
msg = "".join(
|
|
[
|
|
msg,
|
|
"\n{more_info}\n\n{uri}\n\n".format(
|
|
more_info=white("More information may be available here:"),
|
|
uri=blue(get_uri(self.code)),
|
|
),
|
|
]
|
|
)
|
|
return msg
|
|
else:
|
|
return "HTTP {0} error: {1}".format(self.status, self.msg)
|