2017-09-15 21 views
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部分,但无法真正理解。

这怎么解决?谢谢你的帮助。

回答

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的多个流量控制功能/红比错误处理程序,他们打破然而,许多栈层次的他们跨越:

catch [ 
    repeat x 10 [ 
     probe x 
     if x = 3 [throw x] 
    ] 
] 
+0

如果我们不需要成功的部分('整数?值...'),我们可以使用'if'而不是'case'吗? – rnso

+0

@rnso是的。 'case'就像一个超级'if'。 '如果错误? foo:尝试[以整数! “Foo”] [...你的错误处理程序在这里...]' – rgchris

2

您可以简单地使用attempt赶上最终转化错误和测试结果值:

calc: does [ 
    either integer? x: attempt [to-integer num_field/text][ 
     print "Number read" 
    ][ 
     print "Could not get number" 
    ] 
] 

但是,在这个特定的ca中有一个更简单的选项SE:

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。红色语言文档在http://docs.red-lang.org(仍在繁重工作中)。