diff --git a/README.rst b/README.rst
index 30404c0..4d3f726 100644
--- a/README.rst
+++ b/README.rst
@@ -68,9 +68,9 @@ Here's an example:
         "$payment_gateway" : "$braintree",
         "$card_bin"        : "542486",
         "$card_last4"      : "4444"             
-    }, 
-    "$currency_code" : "USD",
-    "$amount" : 15230000,
+      }, 
+      "$currency_code" : "USD",
+      "$amount" : 15230000,
     }
 
     response = client.track(event, properties)
diff --git a/setup.py b/setup.py
index dd04072..e60cbaf 100644
--- a/setup.py
+++ b/setup.py
@@ -19,7 +19,7 @@ except:
 setup(
     name='Sift',
     description='Python bindings for Sift Science\'s API',
-    version='1.1.2.2', # NB: must be kept in sync with sift/version.py
+    version='1.1.2.3', # NB: must be kept in sync with sift/version.py
     url='https://siftscience.com',
 
     author='Sift Science',
diff --git a/sift/client.py b/sift/client.py
index 68e9311..72fbe38 100644
--- a/sift/client.py
+++ b/sift/client.py
@@ -105,8 +105,7 @@ class Client(object):
             return Response(response)
         except requests.exceptions.RequestException as e:
             warnings.warn('Failed to track event: %s' % properties)
-            warnings.warn(traceback.format_exception_only(type(e), e))
-
+            warnings.warn(traceback.format_exc())
             return e
 
     def score(self, user_id, timeout = None):
@@ -137,8 +136,7 @@ class Client(object):
             return Response(response)
         except requests.exceptions.RequestException as e:
             warnings.warn('Failed to get score for user %s' % user_id)
-            warnings.warn(traceback.format_exception_only(type(e), e))
-
+            warnings.warn(traceback.format_exc())
             return e
 
     def label(self, user_id, properties, timeout = None):
@@ -192,8 +190,7 @@ class Client(object):
 
         except requests.exceptions.RequestException as e:
             warnings.warn('Failed to unlabel user %s' % user_id)
-            warnings.warn(traceback.format_exception_only(type(e), e))
-
+            warnings.warn(traceback.format_exc())
             return e
 
 
diff --git a/sift/version.py b/sift/version.py
index 3b2ddd3..5a6aa7f 100644
--- a/sift/version.py
+++ b/sift/version.py
@@ -1,3 +1,3 @@
 # NB: Be sure to keep in sync w/ setup.py
-VERSION = '1.1.2.2'
+VERSION = '1.1.2.3'
 API_VERSION = '203'

Warnings cause TypeError
I'm seeing some TypeError exceptions, it seems that the new warnings / exception handling code has some issues?

```
  ...
  File "tasks.py", line 296, in track_sift_event
    response = sift_client.track(event_type, attrs)
  File "/home/ubuntu/closeio/venv/local/lib/python2.7/site-packages/sift/client.py", line 108, in track
    warnings.warn(traceback.format_exception_only(type(e), e))
TypeError: expected string or buffer
```

Not sure exactly how/when/why this happens but it seems that the Sift responses aren't always handled properly.

/cc @JohnMcSpedon @fredsadaghiani 
diff --git a/tests/client_test.py b/tests/client_test.py
index e2d57c0..1c0b43e 100644
--- a/tests/client_test.py
+++ b/tests/client_test.py
@@ -1,4 +1,5 @@
 import datetime
+import warnings
 import json
 import mock
 import sift
@@ -303,6 +304,41 @@ class TestSiftPythonClient(unittest.TestCase):
             assert(response.is_ok())
             assert(response.api_error_message == "OK")
             assert(response.body['score'] == 0.55)
+
+    def test_exception_during_track_call(self):
+        with warnings.catch_warnings(record=True) as w:
+            warnings.simplefilter("always")
+            with mock.patch('requests.post') as mock_post:
+                mock_post.side_effect = mock.Mock(side_effect = requests.exceptions.RequestException("Failed"))
+                response = self.sift_client.track('$transaction', valid_transaction_properties())
+            assert(len(w) == 2)
+            assert('Failed to track event:' in str(w[0].message))
+            assert('RequestException: Failed' in str(w[1].message))
+            assert('Traceback' in str(w[1].message))
+
+    def test_exception_during_score_call(self):
+        with warnings.catch_warnings(record=True) as w:
+            warnings.simplefilter("always")
+            with mock.patch('requests.get') as mock_get:
+                mock_get.side_effect = mock.Mock(side_effect = requests.exceptions.RequestException("Failed"))
+                response = self.sift_client.score('Fred')
+            assert(len(w) == 2)
+            assert('Failed to get score for user Fred' in str(w[0].message))
+            assert('RequestException: Failed' in str(w[1].message))
+            assert('Traceback' in str(w[1].message))
+
+    def test_exception_during_unlabel_call(self):
+        with warnings.catch_warnings(record=True) as w:
+            warnings.simplefilter("always")
+            with mock.patch('requests.delete') as mock_delete:
+                mock_delete.side_effect = mock.Mock(side_effect = requests.exceptions.RequestException("Failed"))
+                response = self.sift_client.unlabel('Fred')
+
+            assert(len(w) == 2)
+            assert('Failed to unlabel user Fred' in str(w[0].message))
+            assert('RequestException: Failed' in str(w[1].message))
+            assert('Traceback' in str(w[1].message))
+
             
 def main():
     unittest.main()

pip install -e .
parse_log_pytest
pytest
pytest
3.9
pytest --no-header -rA --tb=line --color=no -p no:cacheprovider -W ignore::DeprecationWarning
certifi==2025.1.31
charset-normalizer==3.4.1
exceptiongroup @ file:///croot/exceptiongroup_1706031385326/work
idna==3.10
iniconfig @ file:///home/linux1/recipes/ci/iniconfig_1610983019677/work
mock==5.2.0
packaging @ file:///croot/packaging_1734472117206/work
pluggy @ file:///croot/pluggy_1733169602837/work
pytest @ file:///croot/pytest_1738938843180/work
requests==2.32.3
-e git+https://github.com/SiftScience/sift-python.git@a9993ecae67cc4804fd572cd3ef95ec9535758a2#egg=Sift
tomli @ file:///opt/conda/conda-bld/tomli_1657175507142/work
urllib3==2.3.0

name: sift-python
channels:
  - defaults
  - https://repo.anaconda.com/pkgs/main
  - https://repo.anaconda.com/pkgs/r
  - conda-forge
dependencies:
  - _libgcc_mutex=0.1=main
  - _openmp_mutex=5.1=1_gnu
  - ca-certificates=2025.2.25=h06a4308_0
  - exceptiongroup=1.2.0=py39h06a4308_0
  - iniconfig=1.1.1=pyhd3eb1b0_0
  - ld_impl_linux-64=2.40=h12ee557_0
  - libffi=3.4.4=h6a678d5_1
  - libgcc-ng=11.2.0=h1234567_1
  - libgomp=11.2.0=h1234567_1
  - libstdcxx-ng=11.2.0=h1234567_1
  - ncurses=6.4=h6a678d5_0
  - openssl=3.0.16=h5eee18b_0
  - packaging=24.2=py39h06a4308_0
  - pip=25.0=py39h06a4308_0
  - pluggy=1.5.0=py39h06a4308_0
  - pytest=8.3.4=py39h06a4308_0
  - python=3.9.21=he870216_1
  - readline=8.2=h5eee18b_0
  - setuptools=75.8.0=py39h06a4308_0
  - sqlite=3.45.3=h5eee18b_0
  - tk=8.6.14=h39e8969_0
  - tomli=2.0.1=py39h06a4308_0
  - tzdata=2025a=h04d1e81_0
  - wheel=0.45.1=py39h06a4308_0
  - xz=5.6.4=h5eee18b_1
  - zlib=1.2.13=h5eee18b_1
  - pip:
      - certifi==2025.1.31
      - charset-normalizer==3.4.1
      - idna==3.10
      - mock==5.2.0
      - requests==2.32.3
      - urllib3==2.3.0
prefix: /opt/conda/envs/sift-python

tests/client_test.py::TestSiftPythonClient::test_exception_during_score_call tests/client_test.py::TestSiftPythonClient::test_exception_during_track_call tests/client_test.py::TestSiftPythonClient::test_exception_during_unlabel_call
tests/client_test.py::TestSiftPythonClient::test_constructor_api_key tests/client_test.py::TestSiftPythonClient::test_constructor_invalid_api_url tests/client_test.py::TestSiftPythonClient::test_constructor_requires_valid_api_key tests/client_test.py::TestSiftPythonClient::test_event_ok tests/client_test.py::TestSiftPythonClient::test_event_with_timeout_param_ok tests/client_test.py::TestSiftPythonClient::test_global_api_key tests/client_test.py::TestSiftPythonClient::test_label_user__with_special_chars_ok tests/client_test.py::TestSiftPythonClient::test_label_user_ok tests/client_test.py::TestSiftPythonClient::test_label_user_with_timeout_param_ok tests/client_test.py::TestSiftPythonClient::test_score__with_special_user_id_chars_ok tests/client_test.py::TestSiftPythonClient::test_score_ok tests/client_test.py::TestSiftPythonClient::test_score_requires_user_id tests/client_test.py::TestSiftPythonClient::test_score_with_timeout_param_ok tests/client_test.py::TestSiftPythonClient::test_sync_score_ok tests/client_test.py::TestSiftPythonClient::test_track_requires_properties tests/client_test.py::TestSiftPythonClient::test_track_requires_valid_event tests/client_test.py::TestSiftPythonClient::test_unicode_string_parameter_support tests/client_test.py::TestSiftPythonClient::test_unlabel_user_ok tests/client_test.py::TestSiftPythonClient::test_unlabel_user_with_special_chars_ok
README.rst sift/client.py sift/version.py setup.py
README.rst sift/client.py sift/version.py setup.py