[MERGE] safe_eval: do not log reported exception, instead re-raise them with a complete stacktrace and the evaluated expression.

bzr revid: vmt@openerp.com-20130226100130-hxwgfvwlvvcox5mr
This commit is contained in:
Vo Minh Thu 2013-02-26 11:01:30 +01:00
commit eb7bc74c51
1 changed files with 12 additions and 8 deletions

View File

@ -35,6 +35,8 @@ from opcode import HAVE_ARGUMENT, opmap, opname
from types import CodeType
import logging
from .misc import ustr
__all__ = ['test_expr', 'safe_eval', 'const_eval']
# The time module is usually already provided in the safe_eval environment
@ -106,11 +108,11 @@ def test_expr(expr, allowed_codes, mode="eval"):
expr = expr.strip()
code_obj = compile(expr, "", mode)
except (SyntaxError, TypeError):
_logger.debug('Invalid eval expression', exc_info=True)
raise
except Exception:
_logger.debug('Disallowed or invalid eval expression', exc_info=True)
raise ValueError("%s is not a valid expression" % expr)
except Exception, e:
import sys
exc_info = sys.exc_info()
raise ValueError, '"%s" while compiling\n%r' % (ustr(e), expr), exc_info[2]
for code in _get_opcodes(code_obj):
if code not in allowed_codes:
raise ValueError("opcode %s not allowed (%r)" % (opname[code], expr))
@ -237,10 +239,12 @@ def safe_eval(expr, globals_dict=None, locals_dict=None, mode="eval", nocopy=Fal
'set' : set
}
)
c = test_expr(expr, _SAFE_OPCODES, mode=mode)
try:
return eval(test_expr(expr, _SAFE_OPCODES, mode=mode), globals_dict, locals_dict)
except Exception:
_logger.exception('Cannot eval %r', expr)
raise
return eval(c, globals_dict, locals_dict)
except Exception, e:
import sys
exc_info = sys.exc_info()
raise exc_info[0], '"%s" while evaluating\n%r' % (ustr(e), expr), exc_info[2]
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: