【问题标题】:Try/catch exceptions in Red language尝试/捕获红色语言中的异常
【发布时间】:2017-09-15 03:23:49
【问题描述】:

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

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

【问题讨论】:

    标签: exception-handling rebol red


    【解决方案1】:

    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]
        ]
    ]
    

    【讨论】:

    • 如果我们不需要成功的部分(integer? value ...),我们可以使用if而不是case吗?
    • @rnso 是的。 case 就像一个超级ifif error? foo: try [to integer! "Foo"][... your error handler here ...]
    【解决方案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 facet 已经包含 /text 的转换版本,如果无法进行转换,则为 none,因此您只需读取/写入该 facet 即可在 text 或 @987654330 中显示数值@面孔。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-13
      • 2011-12-05
      • 2014-05-11
      • 1970-01-01
      • 2020-10-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多