NovaBryan/EVE_Dump
Log | Files | 📦 下载最新源码 (.zip) | Refs | README

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)