diff --git a/addon.xml b/addon.xml
index e8ffd37a..71fcf025 100644
--- a/addon.xml
+++ b/addon.xml
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
 <addon  id="plugin.video.emby"
         name="Emby" 
-        version="2.3.2"
+        version="2.3.4"
         provider-name="Emby.media">
   <requires>
     <import addon="xbmc.python" version="2.19.0"/>
diff --git a/changelog.txt b/changelog.txt
index 28c2be74..c6b947e5 100644
--- a/changelog.txt
+++ b/changelog.txt
@@ -1,3 +1,9 @@
+version 2.3.4
+- add throttling for error event logging
+
+version 2.3.3
+- minor fix to exception handling
+
 version 2.3.1
 - minor fixes
 
diff --git a/resources/lib/ga_client.py b/resources/lib/ga_client.py
index d4b476d6..8a886fc9 100644
--- a/resources/lib/ga_client.py
+++ b/resources/lib/ga_client.py
@@ -8,6 +8,7 @@ import md5
 import xbmc
 import platform
 import xbmcgui
+import time
 from utils import window, settings, language as lang
 
 log = logging.getLogger("EMBY."+__name__)
@@ -15,6 +16,8 @@ log = logging.getLogger("EMBY."+__name__)
 # for info on the metrics that can be sent to Google Analytics
 # https://developers.google.com/analytics/devguides/collection/protocol/v1/parameters#events
 
+logEventHistory = {}
+
 class GoogleAnalytics():
 
     testing = False
@@ -128,7 +131,18 @@ class GoogleAnalytics():
     
         self.sendData(data)
     
-    def sendEventData(self, eventCategory, eventAction, eventLabel=None):
+    def sendEventData(self, eventCategory, eventAction, eventLabel=None, throttle=False):
+        
+        # if throttling is enabled then only log the same event every 5 min
+        if(throttle):
+            throttleKey = eventCategory + "-" + eventAction + "-" + str(eventLabel)
+            lastLogged = logEventHistory.get(throttleKey)
+            if(lastLogged != None):
+                timeSinceLastLog = time.time() - lastLogged
+                if(timeSinceLastLog < 300):
+                    log.info("SKIPPING_LOG_EVENT : " + str(timeSinceLastLog) + " " + throttleKey)
+                    return
+            logEventHistory[throttleKey] = time.time()
         
         data = self.getBaseData()
         data['t'] = 'event' # action type
diff --git a/resources/lib/objects/_common.py b/resources/lib/objects/_common.py
index f683343e..484b602d 100644
--- a/resources/lib/objects/_common.py
+++ b/resources/lib/objects/_common.py
@@ -30,7 +30,7 @@ def catch_except(errors=(Exception, ), default_value=False):
                 return func(*args, **kwargs)
             except errors as error:
                 errStrings = ga.formatException()
-                ga.sendEventData("Exception", errStrings[0], errStrings[1])
+                ga.sendEventData("Exception", errStrings[0], errStrings[1], True)
                 log.exception(error)
                 log.error("function: %s \n args: %s \n kwargs: %s",
                           func.__name__, args, kwargs)
diff --git a/resources/lib/utils.py b/resources/lib/utils.py
index d1ac9859..420c4a7f 100644
--- a/resources/lib/utils.py
+++ b/resources/lib/utils.py
@@ -307,21 +307,6 @@ def indent(elem, level=0):
         if level and (not elem.tail or not elem.tail.strip()):
           elem.tail = i
 
-def catch_except(errors=(Exception, ), default_value=False):
-    # Will wrap method with try/except and print parameters for easier debugging
-    def decorator(func):
-        def wrapper(*args, **kwargs):
-            try:
-                return func(*args, **kwargs)
-            except errors as error:
-                log.exception(error)
-                log.error("function: %s \n args: %s \n kwargs: %s",
-                          func.__name__, args, kwargs)
-                return default_value
-
-        return wrapper
-    return decorator
-
 def profiling(sortby="cumulative"):
     # Will print results to Kodi log
     def decorator(func):