# Buggy code
def _catch_login_errors(func) -> Callable:
    """Detect AlexapyLoginError and attempt relogin."""
    import functools

    @functools.wraps(func)
    async def wrapper(*args, **kwargs) -> Any:
        try:
            result = await func(*args, **kwargs)
        except AlexapyLoginError as ex:  # pylint: disable=broad-except
            template = "An exception of type {0} occurred. Arguments:\n{1!r}"
            message = template.format(type(ex).__name__, ex.args)
            _LOGGER.debug(
                "%s.%s: detected bad login: %s",
                func.__module__[func.__module__.find(".") + 1 :],
                func.__name__,
                message,
            )
            instance = args[0]
            if hasattr(instance, "_login"):
                login = instance._login
                email = login.email
                hass = instance.hass if instance.hass else None
                if hass and (
                    "configurator"
                    not in (hass.data[DATA_ALEXAMEDIA]["accounts"][email])
                    or not (
                        hass.data[DATA_ALEXAMEDIA]["accounts"][email]["configurator"]
                    )
                ):
                    config_entry = hass.data[DATA_ALEXAMEDIA]["accounts"][email][
                        "config_entry"
                    ]
                    setup_alexa = hass.data[DATA_ALEXAMEDIA]["accounts"][email][
                        "setup_alexa"
                    ]
                    test_login_status = hass.data[DATA_ALEXAMEDIA]["accounts"][email][
                        "test_login_status"
                    ]
                    _LOGGER.debug(
                        "%s: Alexa API disconnected; attempting to relogin",
                        hide_email(email),
                    )
                    if login.status:
                        await login.reset()
                        await login.login()
                        await test_login_status(hass, config_entry, login, setup_alexa)
            return None
        return result

    return wrapper


# Traceback (RuntimeError)
2020-06-21 12:36:29 ERROR (MainThread) [alexapy.helpers] alexaapi.get_state((<alexapy.alexaapi.AlexaAPI object at 0xa8cddbd0>,), {}): An error occured accessing AlexaAPI: An exception of type RuntimeError occurred. Arguments:
('Session is closed',)
2020-06-21 12:36:29 ERROR (MainThread) [homeassistant.util.logging] Exception in _handle_event when dispatching 'alexa_media_a******e@g*******m': ({'player_state': {'destinationUserId': 'XXX', 'dopplerId': {'deviceType': 'AB72C64C86AW2', 'deviceSerialNumber': 'XXX'}, 'audioPlayerState': 'PLAYING', 'quality': None, 'error': False, 'errorMessage': None, 'mediaReferenceId': '78e56ac3-4ab4-4c85-86b4-3d9bb3f5ae60:6'}},)
Traceback (most recent call last):
File "/config/custom_components/alexa_media/media_player.py", line 369, in _handle_event
await self.async_update()
File "/config/custom_components/alexa_media/helpers.py", line 148, in wrapper
result = await func(*args, **kwargs)
File "/config/custom_components/alexa_media/media_player.py", line 802, in async_update
device, no_throttle=True
File "/config/custom_components/alexa_media/helpers.py", line 148, in wrapper
result = await func(*args, **kwargs)
File "/config/custom_components/alexa_media/media_player.py", line 545, in refresh
session = await self.alexa_api.get_state()
File "/usr/local/lib/python3.7/site-packages/alexapy/helpers.py", line 69, in wrapper
return await func(*args, **kwargs)
File "/usr/local/lib/python3.7/site-packages/alexapy/alexaapi.py", line 761, in get_state
+ "&amp;screenWidth=2560"
File "/usr/local/lib/python3.7/site-packages/alexapy/alexaapi.py", line 122, in _get_request
return await self._request("get", uri, data)
File "/usr/local/lib/python3.7/site-packages/backoff/_async.py", line 133, in retry
ret = await target(*args, **kwargs)
File "/usr/local/lib/python3.7/site-packages/alexapy/alexaapi.py", line 93, in _request
ssl=self._login._ssl,
File "/usr/local/lib/python3.7/site-packages/alexapy/aiohttp/client.py", line 377, in _request
raise RuntimeError("Session is closed")
RuntimeError: Session is closed

# Fixed code
def _catch_login_errors(func) -> Callable:
    """Detect AlexapyLoginError and attempt relogin."""
    import functools

    @functools.wraps(func)
    async def wrapper(*args, **kwargs) -> Any:
        instance = args[0]
        if hasattr(instance, "check_login_changes"):
            instance.check_login_changes()
        try:
            result = await func(*args, **kwargs)
        except AlexapyLoginError as ex:  # pylint: disable=broad-except
            template = "An exception of type {0} occurred. Arguments:\n{1!r}"
            message = template.format(type(ex).__name__, ex.args)
            _LOGGER.debug(
                "%s.%s: detected bad login: %s",
                func.__module__[func.__module__.find(".") + 1 :],
                func.__name__,
                message,
            )
            instance = args[0]
            if hasattr(instance, "_login"):
                login = instance._login
                email = login.email
                hass = instance.hass if instance.hass else None
                if hass and (
                    "configurator"
                    not in (hass.data[DATA_ALEXAMEDIA]["accounts"][email])
                    or not (
                        hass.data[DATA_ALEXAMEDIA]["accounts"][email]["configurator"]
                    )
                ):
                    config_entry = hass.data[DATA_ALEXAMEDIA]["accounts"][email][
                        "config_entry"
                    ]
                    setup_alexa = hass.data[DATA_ALEXAMEDIA]["accounts"][email][
                        "setup_alexa"
                    ]
                    test_login_status = hass.data[DATA_ALEXAMEDIA]["accounts"][email][
                        "test_login_status"
                    ]
                    _LOGGER.debug(
                        "%s: Alexa API disconnected; attempting to relogin",
                        hide_email(email),
                    )
                    if login.status:
                        await login.reset()
                        await login.login()
                        await test_login_status(hass, config_entry, login, setup_alexa)
            return None
        return result

    return wrapper