2017-09-15 9 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 : try [정수로! "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는 : 어떤 변환 할 수없는 경우 당신은 단지 수치가 text 또는 field면에 표시 할 그면을 읽기/쓰기 할 수 있도록

calc: does [ 
    either integer? x: num_field/data [ 
     print "Number read" 
    ][ 
     print "Could not get number" 
    ] 
] 

/data면 이미 /text의 변환 된 버전을 포함, 또는 none.

나는 http://static.red-lang.org/red-system-specs.html의 10 절을 확인하려고했지만 실제로 이해할 수 없었다.

이 문서는 Red/System, Red로 포함 된 시스템 프로그래밍 DSL에 대한 것입니다. Red 언어 설명서는 http://docs.red-lang.org에 있습니다 (여전히 많은 작업이 진행 중입니다).