用Red语言尝试/捕获异常

时间:2017-09-15 03:23:50

标签: exception-handling rebol red

我有一个带有文本字段和按钮的小型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节,但无法理解。

如何解决这个问题?谢谢你的帮助。

2 个答案:

答案 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"]
与错误处理程序相比,

CATCHTHROW是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,因此您只需读取/写入该构面即可显示数值textfield面孔。

  

我试图查看http://static.red-lang.org/red-system-specs.html的第10部分,但无法理解。

该文档适用于Red / System,嵌入Red的系统编程DSL。 Red语言文档位于http://docs.red-lang.org(仍在繁重的工作中)。