2010-12-10 7 views
4

나는 erlang에 꽤 익숙하다. 그리고 나는 try/catch 문을 작동 시키려고 노력 중이다. 나는 일부 요청을 처리하기 위해 웹마 스터를 사용하고 있으며, 일부 JSON 데이터를 구문 분석하여 리턴하고 싶다. JSON 데이터가 유효하지 않은 경우, 오류 메시지를 리턴하고 싶다. 지금까지. try/catch가 erlang에서 작동하도록하는 방법

이 코드는 컴파일

to_text(ReqData, Context) ->  
    Body = "{\"firstName\": \"John\"\"lastName\": \"Smith\"}", 
    try decode(Body) of 
    _ -> {"Success! Json decoded!",ReqData,Context} 
catch 
    _ -> {"Error! Json is invalid",ReqData,Context} 
end.   


decode(Body) -> 
    {struct, MJ} = mochijson:decode(Body). 

(JSON 데이터가 유효하지 않습니다),하지만 난 그것을 실행하고 텍스트에 대한 요청을 보낼 때, 나는 다시 오류를 다음 얻을.

error,{error,{case_clause,{{const,"lastName"}, 
          ": \"Smith\"}", 
          {decoder,utf8,null,1,31,comma}}}, 
       [{mochijson,decode_object,3}, 
       {mochijson,json_decode,2}, 
       {webmachine_demo_resource,test,1}, 
       {webmachine_demo_resource,to_text,2}, 
       {webmachine_demo_resource,to_html,2}, 
       {webmachine_resource,resource_call,3}, 
       {webmachine_resource,do,3}, 
       {webmachine_decision_core,resource_call,1}]}} 

정확히 내가 뭘 잘못하고 있는거야? 설명서에 따르면 "catch"문은 모든 오류를 처리하고, 또는 mochijson : decode에 의해 던져지는 특정 오류를 잡으려면 뭔가해야합니다. 리드 또는 조언을 제공해 주시면 도움이 될 것입니다. 감사.

답변

14

catch 절 "_ -> ..."은 'throw'클래스의 예외 만 잡습니다. 다른 종류의 예외를 잡으려면 "클래스 : 용어 -> ..."형식으로 패턴을 작성해야합니다 (즉, 기본 클래스는 'throw'임). 귀하의 경우 :이 작업을 수행 할 때

catch 
    _:_ -> {"Error! Json is invalid",ReqData,Context} 
end 

, 당신은 항상 자신에게 당신이 가능한 모든 예외를 캐치하는 이유을 요청해야합니다. 타사 코드가 어떻게 작동하는지 모를 경우 일반적으로 문제가되지 않습니다. 자신의 코드를 호출하는 경우 기본적으로 오류에 대한 모든 정보를 버리고 디버깅을 훨씬 어렵게 만듭니다. 특정 예상 사례 만 잡으려고 좁히고 다른 예외가 빠지게하면 (실제 실패가 발생한 곳을 볼 수 있도록) 그렇게하십시오.

+0

감사합니다. RichardC 님, 제가 찾고있는 것이 맞습니다. – user436605

+0

예, 충돌하게하십시오! –

+0

@RichardC try catch를 사용하는 동시에 스택 추적을 인쇄하는 방법? – coffeMug

관련 문제