2010-01-29 5 views
2

Gen_server가 시작되지 않은 경우 예외 메시지가 발생합니다.Erlang에서 예외 메시지를 잡는 방법?

([email protected])32> R11 = system_warning:self_test("SysWarn"). 
** exception exit: {noproc, 
        {gen_server,call, 
        [system_warning_sup, 
         {start_child, 
         {system_warning_SysWarn, 
         {system_warning,start_link,[{system_warning_SysWarn}]}, 
         permanent,10,worker, 
         [system_warning]}}, 
         infinity]}} 
    in function gen_server:call/3 
    in call from system_warning_sup:'-start_child/1-lc$^0/1-0-'/1 
    in call from system_warning:self_test/1 
([email protected])33> R11. 
* 1: variable 'R11' is unbound 

이제 내가하고 싶은 (같은 언 바운드 이상했다) 변수 R11에 투입이 예외 메시지 &를 잡을 것입니다. gen_sever가 시작되지 않으면이 메시지를받은 후 시작하기 때문에 그렇게하고 싶습니다. 나 또한 handle_info 사용하여 시도했지만 예외를 트래핑 할 수 없거나 올바르게 구현할 수 없습니다. 어떤 문제라도 해결할 수 있습니까? 예를 들어 코드를 제공하십시오. R11 = 캐치 system_warning : self_test (....)

+1

내 질문과 관련된 질문이 하나 있습니다. http://stackoverflow.com/questions/1335758/how-can-i-write-an-exception-stack-trace-in-erlang-after-catching-it – iankits

답변

6

모두 @ W55tKQbuRu28Q4xv 및 @Zed에서 답변하는 올바른하지만 조금 간결

+0

물건을 정리해 주셔서 고마워요 ... 정말 도움이되었습니다. :) – iankits

+0

자바에서 이걸 가져 왔어야합니다.하지만 이전의 catch 구문을 결코 좋아하지 않았습니다 ... 정확히 "기능"때문에 언급했습니다. :) – Zed

0

봅니다 '캐치'를 사용합니다. :-)

로컬로 오류를 catch하는 방법은 두 가지가 있습니다. catchtry입니다. 둘 다 throw에 의해 생성 된 비 지역 수익을 포착합니다.

catch은 둘 중 더 간단하고 더 단순하며 구문은 catch Expr입니다. 평가중인 표현식에서 오류가 발생하면 catch{'EXIT',ErrorValue}을 리턴하고, 그렇지 않으면 단지 표현식의 값을 리턴합니다. 한 가지 문제는 오류 반환 값이 생성되어 어떻게 표현식에 위조 될 수 있는지를 볼 수있는 방법이 없다는 것입니다. 같은 방법으로 반환 값이 throw에서 오는 지 확인할 수 없습니다. N.B. 이것은 이 아니라 버그이지만 기능입니다.

R11 = (catch system_warning:self_test (....)) 

은 혼동을 피하기 위해 : 당신이 정상적으로 좋아 사용할 것이다, 그래서 또한 그것은 접두사 연산자는 낮은 우선 순위입니다. 이것은 실수 였고 catch ... end이어야합니다.

throw은 더 복잡하고 일반 잡기와 오류/비 지역 반환을 모두 처리하는 방법을 제어 할 수 있습니다. 자세한 설명은 설명서를 참조하십시오. @ Zed의 예제는 모든 것을 포착하는 가장 간단한 경우를 보여줍니다.

+0

(zerg @ casper) 1> 케이스 catch drmaa : 시작 (zerg @ casper) 1> E -> io : 형식 ("~ p ~ n", [E]) 끝 부분에있는. { "EXIT"{미확정 [{drmaa 시작, []} {erl_eval, do_apply, 5}, {erl_eval, EXPR, 5}, {erl_eval, EXPR, 5}, {셸 {shell, eval_loop, 3}]} ok (zerg @ casper) 2> – W55tKQbuRu28Q4xv

+0

감사합니다 ... 미안하지만 ... 캐치 물건에 관한 많은 사실에 대해서도 이렇게 쓰여질 수 있었고 노력했으나 효과가 없었습니다. :) ( – iankits

+0

평화 롭다! :) 내 대답도 정확하지 않았습니다. – W55tKQbuRu28Q4xv

5
> try           
> R11 = system_warning:self_test("SysWarn") 
> catch          
> Ex:Type -> {Ex,Type,erlang:get_stacktrace()}      
> end. 
관련 문제