3

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

如何解决?谢谢你的帮助。

4

2 回答 2

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]
    ]
]
于 2017-09-15T04:07:39.890 回答
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"
    ]
]

/datafacet 包含已经转换的版本,/text或者如果无法进行转换,因此您只需读取/写入该 facet 即可在或facesnone中显示数值。textfield

我试图检查http://static.red-lang.org/red-system-specs.html的第 10 节,但无法真正理解。

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

于 2017-09-15T10:20:34.973 回答