traitement des erreurs de segmentation cython

J’emballe une bibliothèque C, et j’ai une fonction qui dans certains cas peut entraîner une erreur de segmentation. Dans ce cas, je dois appeler la deuxième fonction qui, dans ce cas, sera terminée avec succès.

Est-ce que quelqu’un sait comment je peux gérer une erreur de segmentation dans Cython?

Un petit exemple qui pourrait aider (en utilisant le signal ):

example.h (en supposant que l’extension Cython s’appelle myext.pyx )

 // Header autogenerated by Cython when declaring "public api" functions #include "../myext_api.h" void handleFuncFailure(char *func1_name, char *func2_name); void generateSegFault(); 

exemple.c

 #include  #include  static char *func2name; static void handler2(int sig) { // Catch exceptions switch(sig) { case SIGSEGV: fputs("Caught SIGSEGV: segfault !!\n", stderr); break; } int error; // "call_a_cy_func()" is provided by "myext.pyx" call_a_cy_func(func2name, &error); exit(sig); } void handleFuncFailure(char *func1_name, char *func2_name) { // Provided by autogenerated "myext_api.h" header import_myext(); func2name = func2_name; signal(SIGSEGV, handler2); int error; // "call_a_cy_func()" is provided by "myext.pyx" call_a_cy_func(func1_name, &error); } void generateSegFault() { *(int*) 0 = 0; } 

myext.pyx

 # Helper function to call a function by its name # "public api" enables to call this function from C side (See above) cdef public api void call_a_cy_func(char* method, bint *error): if (method in globals()): error[0] = 0 globals()[method](); else: error[0] = 1 # Expose C functions cdef extern from "src/example.h": void handleFuncFailure(char *func1_name, char *func2_name) void generateSegFault() # The unreliable function def func1(): print "hello1 ! Generating segfault..." generateSegFault() # The reliable function def func2(): print "hello2 ! Running safe code..." # To be called from the Cython extension inner code cdef myHandleFuncFailure(f1, f2): handleFuncFailure(f1, f2) # To be called from Python source by importing "myext" module def myHandleFuncFailure2(): myHandleFuncFailure("func1", "func2") 

Ouput

bonjour1! Génération de segfault …

SIGSEGV Pris: segfault !!

bonjour2! Exécuter du code sécurisé …

J’espère que cela donne quelques idées, au moins …