mirror of
https://github.com/KenanZhu/AutoLibrary.git
synced 2026-06-17 23:13:03 +08:00
fix(autoscript): 为异常添加行号信息并补充类型兼容性检查
This commit is contained in:
@@ -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(
|
||||
|
||||
@@ -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:
|
||||
|
||||
Reference in New Issue
Block a user