<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def _make_request(self, endpoint, params):
 """ Prepares the request and catches common errors and returns tuple of data and the request response. Read more about error codes: https://docs.polrproject.org/en/latest/developer-guide/api/#http-error-codes :param endpoint: full endpoint url :type endpoint: str :param params: parameters for the given endpoint :type params: dict :return: Tuple of response data, and the response instance :rtype: dict, requests.Response """

        # params = {
        #     **self._base_params,  # Mind order to allow params to overwrite base params
        #     **params
        # }
        full_params = self._base_params.copy()
        full_params.update(params)
        try:
            r = requests.get(endpoint, full_params)
            data = r.json()
            if r.status_code == 401 and not endpoint.endswith('lookup'):
                raise exceptions.UnauthorizedKeyError
            elif r.status_code == 400 and not endpoint.endswith('shorten'):
                raise exceptions.BadApiRequest
            elif r.status_code == 500:
                raise exceptions.ServerOrConnectionError
            return data, r
        except ValueError as e:
            raise exceptions.BadApiResponse(e)
        except requests.RequestException:
            raise exceptions.ServerOrConnectionError