1+ import logging
2+ import sys
3+
14from . import bucketer
25from . import event_builder
36from . import exceptions
@@ -27,14 +30,33 @@ def __init__(self, datafile, event_dispatcher=None, logger=None, error_handler=N
2730 By default JSON schema validation will be performed.
2831 """
2932
33+ self .is_valid = True
3034 self .event_dispatcher = event_dispatcher or default_event_dispatcher
3135 self .logger = logger or noop_logger
3236 self .error_handler = error_handler or noop_error_handler
33- self ._validate_inputs (datafile , skip_json_validation )
3437
35- self .config = project_config .ProjectConfig (datafile , self .logger , self .error_handler )
38+ try :
39+ self ._validate_inputs (datafile , skip_json_validation )
40+ except exceptions .InvalidInputException as error :
41+ self .is_valid = False
42+ logging .error (str (error ))
43+ return
44+
45+ try :
46+ self .config = project_config .ProjectConfig (datafile , self .logger , self .error_handler )
47+ except :
48+ self .is_valid = False
49+ self .config = None
50+ logging .error (enums .Errors .INVALID_INPUT_ERROR .format ('datafile' ))
51+ return
52+
3653 self .bucketer = bucketer .Bucketer (self .config )
37- self .event_builder = event_builder .get_event_builder (self .config , self .bucketer )
54+
55+ try :
56+ self .event_builder = event_builder .get_event_builder (self .config , self .bucketer )
57+ except :
58+ self .is_valid = False
59+ logging .error (enums .Errors .UNSUPPORTED_DATAFILE_VERSION )
3860
3961 def _validate_inputs (self , datafile , skip_json_validation ):
4062 """ Helper method to validate all input parameters.
@@ -48,16 +70,16 @@ def _validate_inputs(self, datafile, skip_json_validation):
4870 """
4971
5072 if not skip_json_validation and not validator .is_datafile_valid (datafile ):
51- raise Exception (enums .Errors .INVALID_INPUT_ERROR .format ('datafile' ))
73+ raise exceptions . InvalidInputException (enums .Errors .INVALID_INPUT_ERROR .format ('datafile' ))
5274
5375 if not validator .is_event_dispatcher_valid (self .event_dispatcher ):
54- raise Exception (enums .Errors .INVALID_INPUT_ERROR .format ('event_dispatcher' ))
76+ raise exceptions . InvalidInputException (enums .Errors .INVALID_INPUT_ERROR .format ('event_dispatcher' ))
5577
5678 if not validator .is_logger_valid (self .logger ):
57- raise Exception (enums .Errors .INVALID_INPUT_ERROR .format ('logger' ))
79+ raise exceptions . InvalidInputException (enums .Errors .INVALID_INPUT_ERROR .format ('logger' ))
5880
5981 if not validator .is_error_handler_valid (self .error_handler ):
60- raise Exception (enums .Errors .INVALID_INPUT_ERROR .format ('error_handler' ))
82+ raise exceptions . InvalidInputException (enums .Errors .INVALID_INPUT_ERROR .format ('error_handler' ))
6183
6284 def _validate_preconditions (self , experiment , user_id , attributes ):
6385 """ Helper method to validate all pre-conditions before we go ahead to bucket user.
@@ -105,6 +127,10 @@ def activate(self, experiment_key, user_id, attributes=None):
105127 None if user is not in experiment or if experiment is not Running.
106128 """
107129
130+ if not self .is_valid :
131+ logging .error (enums .Errors .INVALID_DATAFILE .format ('activate' ))
132+ return None
133+
108134 experiment = self .config .get_experiment_from_key (experiment_key )
109135 if not experiment :
110136 self .logger .log (enums .LogLevels .INFO , 'Not activating user "%s".' % user_id )
@@ -126,7 +152,11 @@ def activate(self, experiment_key, user_id, attributes=None):
126152 self .logger .log (enums .LogLevels .DEBUG ,
127153 'Dispatching impression event to URL %s with params %s.' % (impression_event .url ,
128154 impression_event .params ))
129- self .event_dispatcher .dispatch_event (impression_event )
155+ try :
156+ self .event_dispatcher .dispatch_event (impression_event )
157+ except :
158+ error = sys .exc_info ()[1 ]
159+ self .logger .log (enums .LogLevels .ERROR , 'Unable to dispatch impression event. Error: %s' % str (error ))
130160
131161 return variation .key
132162
@@ -140,13 +170,17 @@ def track(self, event_key, user_id, attributes=None, event_value=None):
140170 event_value: Value associated with the event. Can be used to represent revenue in cents.
141171 """
142172
173+ if not self .is_valid :
174+ logging .error (enums .Errors .INVALID_DATAFILE .format ('track' ))
175+ return
176+
143177 if attributes and not validator .are_attributes_valid (attributes ):
144178 self .logger .log (enums .LogLevels .ERROR , 'Provided attributes are in an invalid format.' )
145179 self .error_handler .handle_error (exceptions .InvalidAttributeException (enums .Errors .INVALID_ATTRIBUTE_FORMAT ))
146180 return
147181
148182 event = self .config .get_event (event_key )
149- if not event . experimentIds :
183+ if not event :
150184 self .logger .log (enums .LogLevels .INFO , 'Not tracking user "%s" for event "%s".' % (user_id , event_key ))
151185 return
152186
@@ -167,7 +201,14 @@ def track(self, event_key, user_id, attributes=None, event_value=None):
167201 self .logger .log (enums .LogLevels .DEBUG ,
168202 'Dispatching conversion event to URL %s with params %s.' % (conversion_event .url ,
169203 conversion_event .params ))
170- self .event_dispatcher .dispatch_event (conversion_event )
204+ try :
205+ self .event_dispatcher .dispatch_event (conversion_event )
206+ except :
207+ error = sys .exc_info ()[1 ]
208+ self .logger .log (enums .LogLevels .ERROR , 'Unable to dispatch conversion event. Error: %s' % str (error ))
209+
210+ else :
211+ self .logger .log (enums .LogLevels .INFO , 'There are no valid experiments for event "%s" to track.' % event_key )
171212
172213 def get_variation (self , experiment_key , user_id , attributes = None ):
173214 """ Gets variation where user will be bucketed.
@@ -182,6 +223,10 @@ def get_variation(self, experiment_key, user_id, attributes=None):
182223 None if user is not in experiment or if experiment is not Running.
183224 """
184225
226+ if not self .is_valid :
227+ logging .error (enums .Errors .INVALID_DATAFILE .format ('get_variation' ))
228+ return None
229+
185230 experiment = self .config .get_experiment_from_key (experiment_key )
186231 if not experiment :
187232 return None
@@ -194,4 +239,3 @@ def get_variation(self, experiment_key, user_id, attributes=None):
194239 return variation .key
195240
196241 return None
197-
0 commit comments