Exception handling 尝试/捕获红色语言中的异常
我有一个带有文本字段和按钮的小型GUI应用程序。该按钮触发一个函数,该函数尝试从文本字段中读取数字。如果文本字段为空或包含非数字文本,则会引发异常 如果文本字段没有值或文本值不是有效数字,我试图捕获错误:Exception handling 尝试/捕获红色语言中的异常,exception-handling,rebol,red,Exception Handling,Rebol,Red,我有一个带有文本字段和按钮的小型GUI应用程序。该按钮触发一个函数,该函数尝试从文本字段中读取数字。如果文本字段为空或包含非数字文本,则会引发异常 如果文本字段没有值或文本值不是有效数字,我试图捕获错误: calc: does [ try [x: to integer! num_field/text] catch [ print "Could not get number"] print "Number read" ] 以下内容也不起作用: calc: does [
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"]
我不知道如何在这里使用“尝试、投掷和接球”。我试着查看第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
,还有TRY
,如果发生错误,它只会返回NONE
。与TRY
不同,您不能分析错误对象
attempt [to integer! "Foo"]
CATCH
和THROW
是Rebol/Red中比错误处理程序更多的流控制函数,它们跨越多个堆栈级别:
catch [
repeat x 10 [
probe x
if x = 3 [throw x]
]
]
您可以简单地使用
尝试
捕获最终的转换错误并测试结果值:
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
,因此您可以读取/写入该方面,以便在文本
或字段
方面显示数值
我试着查看第10节,但无法真正理解
该文档适用于Red/System,即嵌入Red的系统编程DSL。红色语言文档处于(仍在繁重的工作中)。如果我们不需要成功的部分(
integer?value…
),是否可以使用if
而不是case
)?@rnso是的<代码>大小写类似于超级if
<代码>如果出错?foo:try[to integer!“foo”][…您的错误处理程序在这里…]