diff --git a/acme/acme/client.py b/acme/acme/client.py index 9455159de..fa903f0e6 100644 --- a/acme/acme/client.py +++ b/acme/acme/client.py @@ -519,7 +519,12 @@ class ClientNetwork(object): # pylint: disable=too-many-instance-attributes self._default_timeout = timeout def __del__(self): - self.session.close() + # Try to close the session, but don't show exceptions to the + # user if the call to close() fails. See #4840. + try: + self.session.close() + except Exception: # pylint: disable=broad-except + pass def _wrap_in_jws(self, obj, nonce): """Wrap `JSONDeSerializable` object in JWS. diff --git a/acme/acme/client_test.py b/acme/acme/client_test.py index cd1a90645..54652b46c 100644 --- a/acme/acme/client_test.py +++ b/acme/acme/client_test.py @@ -600,12 +600,19 @@ class ClientNetworkTest(unittest.TestCase): mock.ANY, mock.ANY, verify=mock.ANY, headers=mock.ANY, timeout=45) - def test_del(self): + def test_del(self, close_exception=None): sess = mock.MagicMock() + + if close_exception is not None: + sess.close.side_effect = close_exception + self.net.session = sess del self.net sess.close.assert_called_once_with() + def test_del_error(self): + self.test_del(ReferenceError) + @mock.patch('acme.client.requests') def test_requests_error_passthrough(self, mock_requests): mock_requests.exceptions = requests.exceptions