结果附加或异常
Result attached or exception
假设我有一个函数 f
,它应该通过调用 g
return 和 attached T
。但是,g
return 是 detachable T
。如果 g
导致 Void,我想引发这样的异常:
f: T
do
if attached g as res then
Result := res
else
raise
end
end
raise
do
(create {DEVELOPER_EXCEPTION}).raise
end
在此设置中,EiffelStudio 在 f
的末尾给我一个错误 VEVI: Variable is not properly set. Variable: Result
。
确实,Result在f
结束时可以为Void,但在这种情况下执行不应该到达f
结束,应该引发异常。
如何重构代码以获得类似的结果?
刚发现在这种情况下可以使用check
s:
f: T
do
if attached g as res then
Result := res
else
raise
end
check attached Result then end
end
但是,我想知道是否有更清洁的方法。
如果引发异常的类型无关紧要,则以下代码将起作用:
f: T
do
Result := g
check is_g_attached: attached Result then end
end
如果引发异常的类型很重要,可以使用后置条件 False
来扩充特征 raise
,表明该特征从不 returns。然后,代码看起来像
f: T
do
Result := g
if not attached Result then
raise
end
end
raise
do
(create {DEVELOPER_EXCEPTION}).raise
ensure
False
end
假设我有一个函数 f
,它应该通过调用 g
return 和 attached T
。但是,g
return 是 detachable T
。如果 g
导致 Void,我想引发这样的异常:
f: T
do
if attached g as res then
Result := res
else
raise
end
end
raise
do
(create {DEVELOPER_EXCEPTION}).raise
end
在此设置中,EiffelStudio 在 f
的末尾给我一个错误 VEVI: Variable is not properly set. Variable: Result
。
确实,Result在f
结束时可以为Void,但在这种情况下执行不应该到达f
结束,应该引发异常。
如何重构代码以获得类似的结果?
刚发现在这种情况下可以使用check
s:
f: T
do
if attached g as res then
Result := res
else
raise
end
check attached Result then end
end
但是,我想知道是否有更清洁的方法。
如果引发异常的类型无关紧要,则以下代码将起作用:
f: T
do
Result := g
check is_g_attached: attached Result then end
end
如果引发异常的类型很重要,可以使用后置条件 False
来扩充特征 raise
,表明该特征从不 returns。然后,代码看起来像
f: T
do
Result := g
if not attached Result then
raise
end
end
raise
do
(create {DEVELOPER_EXCEPTION}).raise
ensure
False
end