红色语言的尝试/捕获异常
问题描述:
我有一个带有文本字段和按钮的小型GUI应用程序。该按钮会触发一个试图从文本字段中读取数字的函数。如果文本字段为空白或具有非数字文本,则会引发异常。红色语言的尝试/捕获异常
我试图抓住错误,如果文本字段不具有价值或者具有文本值,而不是一个有效的数字:
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部分,但无法真正理解。
这怎么解决?谢谢你的帮助。
答
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的多个流量控制功能/红比错误处理程序,他们打破然而,许多栈层次的他们跨越:
catch [
repeat x 10 [
probe x
if x = 3 [throw x]
]
]
答
您可以简单地使用attempt
赶上最终转化错误和测试结果值:
calc: does [
either integer? x: attempt [to-integer num_field/text][
print "Number read"
][
print "Could not get number"
]
]
但是,在这个特定的ca中有一个更简单的选项SE:
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。红色语言文档在http://docs.red-lang.org(仍在繁重工作中)。
如果我们不需要成功的部分('整数?值...'),我们可以使用'if'而不是'case'吗? – rnso
@rnso是的。 'case'就像一个超级'if'。 '如果错误? foo:尝试[以整数! “Foo”] [...你的错误处理程序在这里...]' – rgchris