2014-10-16 3 views
1

방금 ​​Cuk 프레임 워크에서 Duktape를 사용하기 시작했습니다. 오류를 잡는 방법을 이해하지 못하면서 전체 API를 읽었습니다. 스택에 넣은 오류 개체에 대한 단서를 찾았습니다. 그러나 오류 (예 : 잘못된 자바 스크립트 구문)가있을 때마다 모든 것이 미쳐서 SEGFAULT가됩니다.Duktape - C에서 오류 잡기

저는 현재 duk_eval 기능 여기

를 사용하여 일부 JS 라인을 평가하고있어의 코드 내 라인 :

duk_push_string(ctx,"pouet"); 
duk_eval(ctx); 

ctx가 사용 duktape 힙

를 만들 때 사용자가 제공하는 기본 컨텍스트입니다 try-catch는 아무 것도 잡아 내지 못합니다

어떤 생각? 사전에

감사

+0

코드를 입력하면 누군가가 아이디어를 얻을 수 있으며 코드가 어디에 위치하는지 표시 할 수 있습니다. –

+0

내가이 질문을 한 이유는 그것이 어떻게 작동하는지 모르기 때문입니다. 이 질문은 정확하게 내가 요구하는 바에 따라 제 질문의 코드는 완전히 부적절합니다. 그러나 어쨌든 나는 약간을 더했다. – Lordrem

+0

아니요, 코드는 관련성이 없습니다. ctx를 정의하고 설정하는 코드는 어디에 있습니까? –

답변

5

할 수 있습니다 duk_peval입니다 duk_eval의 보호 변형을 사용하여 자바 스크립트 코드의 실행 중에 "캐치"오류 :

duk_push_string(ctx, "syntax error="); 
if (duk_peval(ctx) != 0) { 
    printf("eval failed: %s\n", duk_safe_to_string(ctx, -1)); 
} else { 
    printf("result is: %s\n", duk_safe_to_string(ctx, -1)); 
} 
duk_pop(ctx); /* pop result */ 

C와 자바 스크립트 코드에 의해 트리거 예외를 혼동하지 마십시오 ++ 예외 : Duktape는 C로 구현되며 C++ 표준 라이브러리가 제공하는 기능을 알지 못합니다. 보호되지 않은 duk_eval 함수 변형을 사용하는 경우 응용 프로그램은 terminated by default입니다. 원하는 경우 C++ 예외가 발생할 수있는 assigning an own fatal handler으로 변경할 수 있습니다.

+0

duk_peval()이 C의 setjump()/longjump() 사용을 금지합니까? 좀 더 일반적으로, "C++에서, 구현은 자동 지속 기간을 가진 객체를 파괴하는 스택 풀기를 수행 할 수 있습니다. 이것이 사소한 소멸자를 호출하면 정의되지 않은 동작이 발생합니다.", C++의 중요하지 않은 소멸자의 유행 (RAII), Duktape를 C++ 코드에서 실제로 사용할 수 있습니까? – ddevienne

+0

Duktape 코드를 파고 들지는 않았지만 setjump/longjump가 'duk_peval'에 의해 _internally_ 사용 된 것 같습니다. 그러나 나는'duk_peval'으로 중요하지 않다고 생각하고 다른 protected 실행 인터페이스 함수는 호출 범위 _에서 벗어나지 않으므로 C++ 스택은 변경되지 않습니다. – blerontin