File size: 2,665 Bytes
9c6594c |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 |
"""normalize."""
import ast
import sys
from functools import wraps
from typing import Callable, TypeVar
import requests
from wandb_gql.client import RetryError
from wandb import env
from wandb.errors import CommError, Error
from wandb.util import parse_backend_error_messages
_F = TypeVar("_F", bound=Callable)
def normalize_exceptions(func: _F) -> _F:
"""Function decorator for catching common errors and re-raising as wandb.Error."""
@wraps(func)
def wrapper(*args, **kwargs):
message = "Whoa, you found a bug."
try:
return func(*args, **kwargs)
except requests.HTTPError as error:
errors = parse_backend_error_messages(error.response)
status = error.response.status_code
if errors:
message = f"HTTP {status}: {'; '.join(errors)}"
elif error.response.text:
message = f"HTTP {status}: {error.response.text}"
elif error.response.reason:
# Visually different to distinguish backend errors from
# standard HTTP status descriptions.
message = f"HTTP {status} ({error.response.reason})"
else:
message = f"HTTP {status}"
raise CommError(message, error)
except RetryError as err:
if (
"response" in dir(err.last_exception)
and err.last_exception.response is not None
):
try:
message = err.last_exception.response.json().get(
"errors", [{"message": message}]
)[0]["message"]
except ValueError:
message = err.last_exception.response.text
else:
message = err.last_exception
if env.is_debug():
raise err.last_exception.with_traceback(sys.exc_info()[2])
else:
raise CommError(message, err.last_exception).with_traceback(
sys.exc_info()[2]
)
except Error:
raise
except Exception as err:
# gql raises server errors with dict's as strings...
if len(err.args) > 0:
payload = err.args[0]
else:
payload = err
if str(payload).startswith("{"):
message = ast.literal_eval(str(payload))["message"]
else:
message = str(err)
if env.is_debug():
raise
else:
raise CommError(message, err).with_traceback(sys.exc_info()[2])
return wrapper
|