2016-07-18 2 views
1

내가 C로 작성된 라이브러리의 상단에 CPython 확장을 쓰고위한 init 메소드에서 예외가 발생하고 난 init 방법에 예외를 발생하는 방법에 대한 해결책을 찾을 수 없습니다 . 그래서 저는 이것을 분리하고 기본적으로 생성자가 속성을 객체에 저장 한 다음 init 메소드 mr.initialize()을 호출해야합니다.어떻게 CPython의 모듈

static int libzihc_MRLoader_init(libzihc_MRLoader *self, PyObject *args, PyObject *kwds) { 
    double error_rate; 
    const char *in; 
    unsigned int capacity; 

    static char *kwlist[] = {"in", NULL}; 
    if (!PyArg_ParseTupleAndKeywords(args, kwds, "s", kwlist, &in)) { 
     return -1; 
    } 
    if (self->dataPath) { 
     free(self->dataPath); 
    } 
    self->dataPath = malloc(sizeof(char)*(strlen(in)+1)); 
    if (self->dataPath) { 
     strcpy(self->dataPath, in); 
    } else { 
     PyErr_NoMemory(); 
    } 
    return 0; 
} 

그래서 같은 추가 초기화 방법 :

여기에 내 현재 코드, 나는 조금 추한이 방법을 발견하고 난 생성자에서 ValueError 예외를 발생하는 솔루션을 찾으려면

CPython 문서에서
static PyObject* initialize(libzihc_MRLoader *self, PyObject *args, PyObject *kwds) { 
    const char * msgError = NULL; 
    int status = openRes(self->dataPath, &(self->ienaKey), &msgError); 

    if(status != 0) { 
     PyErr_SetString(PyExc_ValueError, msgError); 
     printf("openRes returns %d\n", status); 
     return (PyObject *) NULL; 
    } 
    return Py_BuildValue("i", status); 
} 

, 당신은 인터프리터가 당신은 내가 PyErr_SetString(PyExc_ValueError, msgError)를 사용하여 내 경우에는 예외를 발생하는 데 사용되는 방법 중 하나를 호출 할 필요가 예외를 제기하고을 반환하려는 경우. CPython의 초기화 방법은 static int해야이 경우

, 그래서 나는 그러나, return 문을 제거, 내가 한, null을 반환 할 수 없습니다, 나는 stdout에 예외를보고 있지만, 인터프리터는 멈추지 않았다.

어떻게하면됩니까?

답변

0

libzihc_MRLoader_init에 음수를 반환해야합니다 (보통 -1). 파이썬이 예외를 설정하고 검색을 끝내고 검색을 종료합니다. 적어도, 그 무엇 type_call 검사의 객체에게 __init__ 방법 호출 한 후 :

type = obj->ob_type; 
    if (PyType_HasFeature(type, Py_TPFLAGS_HAVE_CLASS) && 
     type->tp_init != NULL && 
     type->tp_init(obj, args, kwds) < 0) { // if res < 0 returns NULL 
     Py_DECREF(obj); 
     obj = NULL; 
    } 

그래서, 특정 경우에, 당신은 libzihc_MRLoader_initinitialize의 코드를 이동할 수 있으며, 오류가 발생한 경우, -1을 반환하는 대신을 null으로 신호하십시오.

+0

귀하의 답변에 대해 @jim에게 감사드립니다.하지만 'null'을 반환하지 않으면 인터프리터는 예외를 catch하지 않으며 실행을 중단하지 않습니다. –

+0

@ e-nouri'libzihc_MRLoader_init'에'-1'을 반환 할 것을 제안했습니다.'-libzihc_MRLoader_init'에서는'initialize'가 아닌'null'을 반환 할 수 없습니다. –

+0

감사합니다. 여기에 게시하기 전에 시도해보아야하지만 PyErr_ * 함수를 호출 한 후 인터프리터를 중지하는 방법에 대한 의사가 명확하지 않았습니다. –

관련 문제