2017-09-15 6 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"] 

I 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から、また、エラーが発生した場合にだけNONEを返しますATTEMPTあります。 TRYとは異なり、エラーオブジェクトは分析できません。

attempt [to integer! "Foo"] 

CATCHTHROWは、彼らが交差しかし、多くのスタックレベルから抜け出す、エラーハンドラよりもREBOLの/レッドでより多くのフロー制御機能です:

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

私たちは成功した部分( 'integer?value ...')を必要としない場合、 'case'の代わりに' if'を使用できますか? – rnso

+0

@rnsoはい。 'case'はsuper -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の変換されたバージョンが含まれているので、あなただけのtextまたはfield顔に表示される数値のためにその面を書く/読むことができます。

http://static.red-lang.org/red-system-specs.htmlのセクション10を確認しようとしましたが、実際には理解できませんでした。

このドキュメントはRed/System、Redで埋め込まれたシステムプログラミングのDSLです。 Red言語のドキュメントはhttp://docs.red-lang.orgです(依然として重労働の下にあります)。

関連する問題