Python | Utilizzo di errori iterabili e diagnostici in C

| |

Codice n. 1: funzione di estensione AC che mostra come utilizzare gli elementi in un iterabile.

statico PyObject * py_consume_iterable (

PyObject * self, PyObject * args)

{

PyObject * obj;

PyObject * iter;

PyObject * elemento;

if (! PyArg_ParseTuple (args, " O " , & amp; obj)) {

return NULL;

}

if ( (iter = PyObject_GetIter (obj)) == NULL) {

return NULL;

}

while ( (item = PyIter_Next (iter))! = NULL) {

/ * Usa prodotto * /

... Py_DECREF (elemento);

}

Py_DECREF (iter);

return Py_BuildValue ( "" < /codice> );

}

Il codice sopra riflette un codice simile in Python. PyObject_GetIter() equivale a chiamare iter() per ottenere un iteratore. La funzione PyIter_Next() chiama il metodo successivo sull’iteratore, restituendo l’elemento successivo o NULL se non ci sono più elementi. Assicurati di fare attenzione con la gestione della memoria — Py_DECREF() deve essere chiamato sia sugli elementi generati che sull’oggetto iteratore stesso per evitare perdite di memoria.

Diagnosi degli errori di segmentazione —
L’interprete si blocca gravemente a causa di un errore di segmentazione, un errore del bus, una violazione di accesso o un altro errore irreversibile. Gli piace ottenere una traccia Python che mostra dove era in esecuzione il programma al momento dell’arresto anomalo.
Il modulo gestore degli errori può aiutarti a risolvere questo problema. Includi il codice seguente nel tuo programma.

Codice n. 2:

import gestore degli errori

faulthandler.enable ()

< p> Oppure avvia Python con il parametro -Xfaulthandler, in questo modo:

 bash% python3 -Xfaulthandler program.py 

Ultimo ma non meno importante, la variabile d’ambiente PYTHONFAULTHANDLER può essere impostata in modo appropriato. Se è abilitato un gestore degli errori, gli errori irreversibili nelle estensioni C causeranno la stampa di tracce Python in caso di errori. Ad esempio:

 Errore irreversibile Python: errore di segmentazione Thread corrente 0x00007fff71106cc0: File "example.py", riga 6 in foo File "example.py", riga 10 nella barra File "example.py", riga 14 nel file spam "example.py", riga 19 in Errore di segmentazione 

Anche se questo non ti dice dove le cose sono andate storte nel codice C, almeno può dirti come è successo con Python.

Il gestore degli errori mostrerà una traccia dello stack di codice Python in esecuzione al momento dell’arresto anomalo. Almeno questo mostrerà la funzione di estensione di livello superiore che è stata chiamata. Puoi usare pdb o un altro debugger Python per esaminare il flusso di codice Python che porta all’errore.