mirror of
https://github.com/KenanZhu/AutoLibrary.git
synced 2026-06-18 15:33:03 +08:00
fix(autoscript): 为异常添加行号信息并补充类型兼容性检查
This commit is contained in:
@@ -307,9 +307,12 @@ def _evaluateCondition(
|
|||||||
continue
|
continue
|
||||||
left_raw = s[:idx].strip()
|
left_raw = s[:idx].strip()
|
||||||
right_raw = s[idx + len(op):].strip()
|
right_raw = s[idx + len(op):].strip()
|
||||||
left_obj = _resolveAsObject(left_raw, target_data)
|
try:
|
||||||
right_obj = _resolveAsObject(right_raw, target_data)
|
left_obj = _resolveAsObject(left_raw, target_data)
|
||||||
return ASOperator.compare(left_obj, right_obj, op, 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(
|
raise ValueError(
|
||||||
_errPos(line, f"无法识别的条件表达式 '{condition_str}'")
|
_errPos(line, f"无法识别的条件表达式 '{condition_str}'")
|
||||||
)
|
)
|
||||||
@@ -352,7 +355,10 @@ def _executeSet(
|
|||||||
if not obj:
|
if not obj:
|
||||||
obj = _SCRIPT_VARS.get(upper_name)
|
obj = _SCRIPT_VARS.get(upper_name)
|
||||||
if obj:
|
if obj:
|
||||||
obj.setValue(resolved, target_data)
|
try:
|
||||||
|
obj.setValue(resolved, target_data)
|
||||||
|
except ValueError as e:
|
||||||
|
raise ValueError(_errPos(line, str(e)))
|
||||||
return
|
return
|
||||||
inferred_type = _inferType(resolved, stripped)
|
inferred_type = _inferType(resolved, stripped)
|
||||||
new_var = ASObject(
|
new_var = ASObject(
|
||||||
@@ -398,8 +404,11 @@ def _executeOperation(
|
|||||||
target = _resolveFieldObj(field_name)
|
target = _resolveFieldObj(field_name)
|
||||||
if target is None:
|
if target is None:
|
||||||
raise ValueError(_errPos(line, f"未知字段 '{field_name}'"))
|
raise ValueError(_errPos(line, f"未知字段 '{field_name}'"))
|
||||||
operand = _resolveAsObject(raw_value, target_data)
|
try:
|
||||||
ASOperator.apply(target, operand, op, target_data)
|
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(
|
def addTargetVar(
|
||||||
|
|||||||
@@ -55,6 +55,14 @@ class ASOperator:
|
|||||||
".BLE.": lambda a, b: a <= b,
|
".BLE.": lambda a, b: a <= b,
|
||||||
}
|
}
|
||||||
_ARITH_TYPES = {"Date", "Time", "Int", "Float"}
|
_ARITH_TYPES = {"Date", "Time", "Int", "Float"}
|
||||||
|
# Comparison-compatible type groups
|
||||||
|
_COMPATIBLE_GROUPS = [
|
||||||
|
{"String"},
|
||||||
|
{"Boolean"},
|
||||||
|
{"Int", "Float"},
|
||||||
|
{"Date"},
|
||||||
|
{"Time"},
|
||||||
|
]
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def apply(
|
def apply(
|
||||||
@@ -177,6 +185,18 @@ class ASOperator:
|
|||||||
cmp_func = cls._COMPARE.get(op)
|
cmp_func = cls._COMPARE.get(op)
|
||||||
if cmp_func is None:
|
if cmp_func is None:
|
||||||
raise ValueError(f"未知的比较操作 '{op}'")
|
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)
|
left_val = left.getValue(target_data)
|
||||||
right_val = right.getValue(target_data)
|
right_val = right.getValue(target_data)
|
||||||
try:
|
try:
|
||||||
|
|||||||
Reference in New Issue
Block a user