上传代码
This commit is contained in:
@@ -11,12 +11,11 @@ import re
|
||||
from xml.dom import minidom
|
||||
|
||||
|
||||
# 配置logging
|
||||
logging.basicConfig(
|
||||
level=logging.INFO,
|
||||
format="%(asctime)s - %(name)s - %(levelname)s - %(message)s",
|
||||
handlers=[logging.FileHandler("bcl_calculator.log"), logging.StreamHandler()],
|
||||
)
|
||||
# 配置logging(不在导入时绑定固定文件,具体文件由调用方配置)
|
||||
_root_logger = logging.getLogger()
|
||||
if not _root_logger.handlers:
|
||||
# 避免 "No handler could be found" 警告
|
||||
_root_logger.addHandler(logging.NullHandler())
|
||||
|
||||
|
||||
class BCLVariantType(Enum):
|
||||
@@ -1609,30 +1608,63 @@ class BCLCalculator:
|
||||
continue
|
||||
|
||||
var_name = var_node.get("text")
|
||||
variables[var_name] = self._get_variable_value(var_name, context)
|
||||
var_value_obj = self._get_variable_value(var_name, context)
|
||||
variables[var_name] = var_value_obj
|
||||
|
||||
# 构建表达式字符串
|
||||
expr_str = expr_node.get("text")
|
||||
expr_str = expr_node.get("text", "<unknown>")
|
||||
if not expr_str:
|
||||
expr_str = "<empty>"
|
||||
|
||||
# 构造符号表,转换为 float
|
||||
symbols = {}
|
||||
for var_name, var_value in variables.items():
|
||||
symbols[var_name] = float("0" if not var_value.get_value() else var_value.get_value())
|
||||
var_values_log = {}
|
||||
for var_name, var_value_obj in variables.items():
|
||||
raw_value = var_value_obj.get_value()
|
||||
try:
|
||||
# 安全转换为 float
|
||||
float_value = float("0" if not raw_value else raw_value)
|
||||
symbols[var_name] = float_value
|
||||
var_values_log[var_name] = float_value
|
||||
except (ValueError, TypeError) as e:
|
||||
var_values_log[var_name] = f"无法转换为float: {raw_value} (类型: {type(raw_value).__name__})"
|
||||
|
||||
logging.debug(f"开始计算表达式: '{expr_str}'")
|
||||
logging.debug(f"变量绑定值: {var_values_log}")
|
||||
|
||||
calculator = ExpressionCalculator()
|
||||
parse_success = calculator.parse_expression(expr_str)
|
||||
if not parse_success:
|
||||
logging.error(f"表达式解析失败: {calculator.get_last_error()}")
|
||||
raise ValueError(f"表达式解析失败: {calculator.get_last_error()}")
|
||||
error_msg = calculator.get_last_error()
|
||||
logging.error(
|
||||
f"[表达式解析失败] " f"表达式='{expr_str}', " f"变量值={var_values_log}, " f"错误详情='{error_msg}'"
|
||||
)
|
||||
raise ValueError(f"表达式解析失败: {error_msg}")
|
||||
|
||||
# 执行四则运算并返回结果
|
||||
result, value = calculator.evaluate(symbols)
|
||||
if not result:
|
||||
logging.error(f"表达式计算失败: {calculator.get_last_error()}")
|
||||
raise ValueError(f"表达式计算失败: {calculator.get_last_error()}")
|
||||
error_msg = calculator.get_last_error()
|
||||
logging.error(
|
||||
f"[表达式计算失败] "
|
||||
f"表达式='{expr_str}', "
|
||||
f"变量值={var_values_log}, "
|
||||
f"错误类型='{error_msg}', "
|
||||
)
|
||||
raise ValueError(f"表达式计算失败: {expr_str} (变量: {var_values_log}) => 错误: {error_msg}")
|
||||
|
||||
logging.debug(f"表达式计算成功: '{expr_str}' => {value}")
|
||||
return BCLVariant(value)
|
||||
|
||||
except Exception as e:
|
||||
raise e
|
||||
# 捕获所有异常,打印完整堆栈和上下文
|
||||
logging.error(
|
||||
f"[_evaluate_expression] 未预期异常: {str(e)}\n"
|
||||
f"表达式节点文本: {expr_node.get('text', 'N/A')}\n"
|
||||
f"变量上下文: {[child.get('text') for child in expr_node if child.get('type') == '变量']}\n"
|
||||
f"完整堆栈:\n{traceback.format_exc()}"
|
||||
)
|
||||
raise
|
||||
|
||||
def _call_function(self, func_name: str, node: ET.Element, context: BCLContext) -> BCLVariant:
|
||||
|
||||
|
||||
Reference in New Issue
Block a user