eve_exception_handler.py (4239B)
1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\eve\client\script\sys\eve_exception_handler.py 2 import sys 3 import stackless 4 import log 5 import traceback 6 import stackless 7 from player_messaging.client.ui_message import prompt_player_fsd_dialog 8 from eveexceptions import UserError 9 from eveprefs import prefs 10 from brennivin import traceback2 11 from carbonui.uicore import uicore 12 13 def _is_destroyed_window(tb): 14 try: 15 argnames = tb.tb_frame.f_code.co_varnames[:tb.tb_frame.f_code.co_argcount + 1] 16 locals_ = tb.tb_frame.f_locals.copy() 17 if argnames: 18 for each in argnames: 19 try: 20 theStr = repr(locals_[each]) 21 if theStr and theStr.find('destroyed=1') != -1: 22 return theStr 23 except: 24 sys.exc_clear() 25 26 return '' 27 except AttributeError: 28 sys.exc_clear() 29 return '' 30 31 32 def handle_exception(exctype, exc, tb, message = ''): 33 try: 34 if _IsUserError(exc): 35 prompt_player_fsd_dialog(exc.msg, exc.dict) 36 return 37 toMsgWindow = _ShouldShowExceptions() 38 if _IsMessageNotFoundError(exc): 39 if toMsgWindow: 40 prompt_player_fsd_dialog('ErrMessageNotFound', exc.args[1]) 41 return 42 if _IsAttributeError(exc): 43 deadWindowCheck = _is_destroyed_window(tb) 44 if deadWindowCheck: 45 name = '' 46 try: 47 nameIdx = deadWindowCheck.find('name=') 48 if nameIdx != -1: 49 nameIdx += 6 50 endNameIdx = deadWindowCheck[nameIdx:].find('",') 51 if endNameIdx != -1: 52 name = deadWindowCheck[nameIdx:nameIdx + endNameIdx] 53 except: 54 sys.exc_clear() 55 56 log.LogWarn('Message sent to dead window:', name) 57 exctype = exc = tb = None 58 return 59 if _IsDisconnectError(exc): 60 toMsgWindow = 0 61 extraText = _BuildContext(exc, message) 62 return _LogException(extraText=extraText, toMsgWindow=toMsgWindow, exctype=exctype, exc=exc, tb=tb, severity=log.LGERR) 63 except: 64 exctype = exc = tb = None 65 traceback.print_exc() 66 sys.exc_clear() 67 68 69 def _IsUserError(exc): 70 return isinstance(exc, UserError) 71 72 73 def _IsMessageNotFoundError(exc): 74 return isinstance(exc, RuntimeError) and len(exc.args) and exc.args[0] == 'ErrMessageNotFound' 75 76 77 def _IsAttributeError(exc): 78 return isinstance(exc, AttributeError) 79 80 81 def _IsDisconnectError(exc): 82 return getattr(exc, 'msg', None) == 'DisconnectedFromServer' 83 84 85 def _IsTaskletBlockedError(exc): 86 return isinstance(exc, RuntimeError) and 'tasklet does not like to be blocked' in str(exc) 87 88 89 def _BuildContext(exc, message): 90 context = '; caught by eve.ExceptionHandler' 91 if message: 92 context += '\nContext Info: ' + message 93 context += '\nUI Context: ' + _GetUiContext() 94 if _IsTaskletBlockedError(exc): 95 taskletStack = _GetTaskletStack() 96 context += '\nTasklet stack:\n' + taskletStack 97 return context 98 99 100 def _GetTaskletStack(): 101 currentTasklet = stackless.getcurrent() 102 if getattr(currentTasklet, 'frame', None): 103 frame = currentTasklet.frame 104 stack = traceback2.format_stack(frame) 105 return ''.join(stack[-2:]) 106 return 'no tasklet frame' 107 108 109 def _GetUiContext(): 110 try: 111 uiRegistry = getattr(uicore, 'registry', None) 112 if not uiRegistry: 113 return 'no UI registry' 114 active = uiRegistry.GetActive() 115 activeName = active.name if active else 'no window active' 116 focused = uiRegistry.GetFocus() 117 focusedName = focused.name if focused else 'no element focused' 118 return 'active={} focused={}'.format(activeName, focusedName) 119 except: 120 return 'no UI context' 121 122 123 def _LogException(extraText, toMsgWindow, exctype, exc, tb, severity): 124 return log.LogException(extraText=extraText, toMsgWindow=toMsgWindow, exctype=exctype, exc=exc, tb=tb, severity=severity) 125 126 127 def _ShouldShowExceptions(): 128 return prefs.GetValue('showExceptions', 0)