diff --git a/rollbar/__init__.py b/rollbar/__init__.py index e3978231..bb7035bd 100644 --- a/rollbar/__init__.py +++ b/rollbar/__init__.py @@ -401,10 +401,23 @@ def prev_page(self): ## internal functions +def _resolve_exception_class(idx, filter): + cls, level = filter + if isinstance(cls, str): + # Lazily resolve class name + parts = cls.split('.') + module = ".".join(parts[:-1]) + if module in sys.modules and hasattr(sys.modules[module], parts[-1]): + cls = getattr(sys.modules[module], parts[-1]) + SETTINGS['exception_level_filters'][idx] = (cls, level) + else: + cls = None + return cls, level def _filtered_level(exception): - for cls, level in SETTINGS['exception_level_filters']: - if isinstance(exception, cls): + for i, filter in enumerate(SETTINGS['exception_level_filters']): + cls, level = _resolve_exception_class(i, filter) + if cls and isinstance(exception, cls): return level return None diff --git a/rollbar/test/test_rollbar.py b/rollbar/test/test_rollbar.py index 1f6f1172..41ec5a8c 100644 --- a/rollbar/test/test_rollbar.py +++ b/rollbar/test/test_rollbar.py @@ -1,5 +1,6 @@ import copy import mock +import unittest import urllib import rollbar @@ -114,6 +115,43 @@ def _raise(): self.assertNotIn('args', payload['data']['body']['trace']['frames'][-1]) self.assertNotIn('kwargs', payload['data']['body']['trace']['frames'][-1]) + @mock.patch('rollbar.send_payload') + def test_exception_filters(self, send_payload): + + rollbar.SETTINGS['exception_level_filters'] = [ + (OSError, 'ignored'), + ('rollbar.ApiException', 'ignored'), + ('bogus.DoesntExist', 'ignored'), + ] + + def _raise_exception(): + try: + raise Exception('foo') + except: + rollbar.report_exc_info() + + def _raise_os_error(): + try: + raise OSError('bar') + except: + rollbar.report_exc_info() + + def _raise_api_exception(): + try: + raise rollbar.ApiException('bar') + except: + rollbar.report_exc_info() + + _raise_exception() + self.assertTrue(send_payload.called) + + _raise_os_error() + self.assertEqual(1, send_payload.call_count) + + _raise_api_exception() + self.assertEqual(1, send_payload.call_count) + + @mock.patch('rollbar.send_payload') def test_report_messsage(self, send_payload): rollbar.report_message('foo') @@ -714,3 +752,6 @@ def step2(): def called_with(arg1): arg1 = 'changed' step1() + +if __name__ == '__main__': + unittest.main()