Exception handling 尝试/捕获红色语言中的异常

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 [

我有一个带有文本字段和按钮的小型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"]
我不知道如何在这里使用“尝试、投掷和接球”。我试着查看第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”][…您的错误处理程序在这里…]