我有一个带有文本字段和按钮的小型GUI应用程序。该按钮触发一个试图从文本字段读取数字的函数。如果文本字段为空或具有非数字文本,则会引发异常。
如果text-field没有值或有文本值而不是有效数字,我试图捕获错误:
calc: does [
try [x: to integer! num_field/text]
catch [ print "Could not get number"]
print "Number read"
]
以下也不起作用:
calc: does [
try [x: to integer! num_field/text]
throw 123
print "Number read"
]
catch 123 [ print "Could not get number"]
我不确定如何使用try,throw和catch。我试图查看http://static.red-lang.org/red-system-specs.html的第10节,但无法理解。
如何解决这个问题?谢谢你的帮助。
答案 0 :(得分:3)
TRY
仍然会传递错误,但是除非它是最后一个评估值,否则它不会被触发。
您可以使用以下内容:
calc: does [
case [
error? value: try [
to integer! num_field/text
][
... do error handling ...
probe make map! body-of :value
]
integer? value [
... do successful thing ...
]
]
]
除了TRY
之外,如果发生错误,还会ATTEMPT
返回NONE
。与TRY
不同,您无法分析错误对象。
attempt [to integer! "Foo"]
与错误处理程序相比, CATCH
和THROW
是Rebol / Red中更多的流控制函数,它们突破了它们交叉的多个堆栈级别:
catch [
repeat x 10 [
probe x
if x = 3 [throw x]
]
]
答案 1 :(得分:2)
您只需使用attempt
来捕获最终转换错误并测试结果值:
calc: does [
either integer? x: attempt [to-integer num_field/text][
print "Number read"
][
print "Could not get number"
]
]
但是,在这种特定情况下,有一个更简单的选择:
calc: does [
either integer? x: num_field/data [
print "Number read"
][
print "Could not get number"
]
]
/data
构面已包含已转换的/text
版本,如果无法进行转换,则为none
,因此您只需读取/写入该构面即可显示数值text
或field
面孔。
我试图查看http://static.red-lang.org/red-system-specs.html的第10部分,但无法理解。
该文档适用于Red / System,嵌入Red的系统编程DSL。 Red语言文档位于http://docs.red-lang.org(仍在繁重的工作中)。