내가 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
에 예외를보고 있지만, 인터프리터는 멈추지 않았다.
어떻게하면됩니까?
귀하의 답변에 대해 @jim에게 감사드립니다.하지만 'null'을 반환하지 않으면 인터프리터는 예외를 catch하지 않으며 실행을 중단하지 않습니다. –
@ e-nouri'libzihc_MRLoader_init'에'-1'을 반환 할 것을 제안했습니다.'-libzihc_MRLoader_init'에서는'initialize'가 아닌'null'을 반환 할 수 없습니다. –
감사합니다. 여기에 게시하기 전에 시도해보아야하지만 PyErr_ * 함수를 호출 한 후 인터프리터를 중지하는 방법에 대한 의사가 명확하지 않았습니다. –