1
1
mirror of https://github.com/KenanZhu/AutoLibrary.git synced 2026-06-17 23:13:03 +08:00

fix(autoscript): 为异常添加行号信息并补充类型兼容性检查

This commit is contained in:
2026-05-17 02:58:47 +08:00
parent 2843300cf9
commit 33c0f4414c
2 changed files with 35 additions and 6 deletions
+15 -6
View File
@@ -307,9 +307,12 @@ def _evaluateCondition(
continue
left_raw = s[:idx].strip()
right_raw = s[idx + len(op):].strip()
left_obj = _resolveAsObject(left_raw, target_data)
right_obj = _resolveAsObject(right_raw, target_data)
return ASOperator.compare(left_obj, right_obj, op, target_data)
try:
left_obj = _resolveAsObject(left_raw, target_data)
right_obj = _resolveAsObject(right_raw, target_data)
return ASOperator.compare(left_obj, right_obj, op, target_data)
except ValueError as e:
raise ValueError(_errPos(line, str(e)))
raise ValueError(
_errPos(line, f"无法识别的条件表达式 '{condition_str}'")
)
@@ -352,7 +355,10 @@ def _executeSet(
if not obj:
obj = _SCRIPT_VARS.get(upper_name)
if obj:
obj.setValue(resolved, target_data)
try:
obj.setValue(resolved, target_data)
except ValueError as e:
raise ValueError(_errPos(line, str(e)))
return
inferred_type = _inferType(resolved, stripped)
new_var = ASObject(
@@ -398,8 +404,11 @@ def _executeOperation(
target = _resolveFieldObj(field_name)
if target is None:
raise ValueError(_errPos(line, f"未知字段 '{field_name}'"))
operand = _resolveAsObject(raw_value, target_data)
ASOperator.apply(target, operand, op, target_data)
try:
operand = _resolveAsObject(raw_value, target_data)
ASOperator.apply(target, operand, op, target_data)
except ValueError as e:
raise ValueError(_errPos(line, str(e)))
def addTargetVar(
+20
View File
@@ -55,6 +55,14 @@ class ASOperator:
".BLE.": lambda a, b: a <= b,
}
_ARITH_TYPES = {"Date", "Time", "Int", "Float"}
# Comparison-compatible type groups
_COMPATIBLE_GROUPS = [
{"String"},
{"Boolean"},
{"Int", "Float"},
{"Date"},
{"Time"},
]
@classmethod
def apply(
@@ -177,6 +185,18 @@ class ASOperator:
cmp_func = cls._COMPARE.get(op)
if cmp_func is None:
raise ValueError(f"未知的比较操作 '{op}'")
left_tp = left.var_type
right_tp = right.var_type
if left_tp != right_tp:
same_group = any(
left_tp in g and right_tp in g
for g in cls._COMPATIBLE_GROUPS
)
if not same_group:
raise ValueError(
f"类型不兼容: 无法将 '{left.name}' ({left_tp}) "
f"'{right.name}' ({right_tp}) 进行比较"
)
left_val = left.getValue(target_data)
right_val = right.getValue(target_data)
try: