2017-09-15 47 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(仍在繁重工作中)。