58 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			58 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| import sys
 | |
| import traceback
 | |
| 
 | |
| import tornado.gen
 | |
| 
 | |
| from common.log import logUtils as log
 | |
| from objects import glob
 | |
| 
 | |
| def capture():
 | |
| 	"""
 | |
| 	Sentry capture decorator. Use like this to send all unhandled exceptions to Sentry:
 | |
| 	```
 | |
| 	@sentry.capture()
 | |
| 	def blablabla():
 | |
| 		print("a a ben warem a ben ben)
 | |
| 	```
 | |
| 	When running `blablabla()`, the traceback will be print on screen and the
 | |
| 	exception will be sent to Sentry, if enabled.
 | |
| 	Requires tornado app in `glob.application` and sentry client in `glob.application.sentry_client`
 | |
| 
 | |
| 	:return:
 | |
| 	"""
 | |
| 	def decorator(func):
 | |
| 		def wrapper(*args, **kwargs):
 | |
| 			try:
 | |
| 				return func(*args, **kwargs)
 | |
| 			except:
 | |
| 				log.error("Unhandled exception!\n```\n{}\n{}```".format(sys.exc_info(), traceback.format_exc()))
 | |
| 				if glob.sentry:
 | |
| 					glob.application.sentry_client.captureException()
 | |
| 		return wrapper
 | |
| 	return decorator
 | |
| 
 | |
| 
 | |
| def captureTornado(func):
 | |
| 	"""
 | |
| 	Capture an exception asynchronously in a tornado handler.
 | |
| 	Use it with asyncGet/asyncPost, like this:
 | |
| 
 | |
| 	```
 | |
| 	@tornado.web.asynchronous
 | |
| 	@tornado.gen.engine
 | |
| 	@sentry.captureTornado
 | |
| 	def asyncGet(self):
 | |
| 		...
 | |
| 	```
 | |
| 
 | |
| 	:param func:
 | |
| 	:return:
 | |
| 	"""
 | |
| 	def wrapper(self, *args, **kwargs):
 | |
| 		try:
 | |
| 			return func(self, *args, **kwargs)
 | |
| 		except:
 | |
| 			log.error("Unhandled exception!\n```\n{}\n{}```".format(sys.exc_info(), traceback.format_exc()))
 | |
| 			if glob.sentry:
 | |
| 				yield tornado.gen.Task(self.captureException, exc_info=True)
 | |
| 	return wrapper |