c ++ eccezioni vs verifiche preliminari delle condizioni di errore

2

Preambolo

Uno dei concetti usati nella scrittura del codice Python è "Più facile chiedere perdono che permesso", alias EAFP . Letteralmente questo significa che invece di fare controlli, se un'operazione è possibile, tu fai l'operazione e "chiedi perdono" se ciò che fai fallisce. Tecnicamente questo significa (solo un esempio senza significato particolare):

try:
    obj.x = 10
    obj.y = 20
except AttributeError:
    pass

Questa tecnica viene spesso utilizzata quando è noto che il codice nel blocco try..except viene eseguito senza errori nella maggior parte dei casi o se il codice viene eseguito di nuovo. Lo stesso codice con i controlli preliminari apparirebbe come segue:

if hasattr(obj, 'x'):
    obj.x = 10

if hasattr(obj, 'y'):
    obj.y = 20

Pratiche C ++

Anche se generalmente non è un problema in Python, C ++ ha una "fiamma" di "eredità" di "funzione che restituisce lo stato di errore" rispetto a "generare eccezioni". Questo è stato discusso molto, ma non riesco a trovare alcuna buona fonte di informazione che descriva se il Pyfton-like EAFP è applicabile in Python.

es. considera quanto segue:

if (node.has_element('x')) {
    node['x'] = 10;
}

vs

try {
    node['x'] = 10;
}
catch(ElementNotFoundException e) {
    // pass
}

Quale approccio è generalmente usato nel codice C ++? Se le prestazioni non sono il problema, scriveresti codice in stile EAFP? Grazie.

    
posta Zaur Nasibov 10.01.2013 - 20:29
fonte

2 risposte

3

È difficile classificare qualcosa come generally used in C++ . Non solo molte aziende hanno le proprie convenzioni, ma C ++ di design ti consente di compilare senza eccezioni il supporto (nessun supporto per lo srotolamento dello stack, prologo di funzione / epilogo).

Detto questo; le eccezioni ignorate sono considerate un anti-modello nella maggior parte delle applicazioni C ++ e dovrebbero di solito essere completate da una buona ragione documentata. Il motivo non è solo la performance, ma perché è considerato un abuso del meccanismo try/catch . L'idioma è che dovrebbe essere usato solo per casi eccezionali, non per il normale flusso di un programma (a differenza di Python, in cui è anche usato per l'iterazione).

    
risposta data 10.01.2013 - 22:09
fonte
5

In base alla mia esperienza, il fatto che sia possibile lanciare un'eccezione per qualcosa di prevedibile è molto raro nel codice C ++. È percepito come non performante e, nonostante il mantra continuamente ripetuto di nessuna ottimizzazione prematura, i programmatori C ++ hanno una lunga cultura di ottimizzazione prematura.

Mi rendo conto che è solo un esempio di illustrazione, ma nel tuo esempio particolare potrei effettivamente optare per una terza opzione, ovvero progettare il contenitore in modo che node['x'] = 10 sia solo un no-op se l'elemento non esistesse a seconda della frequenza con cui è stata necessaria questa logica rispetto a un inserto. Odio ripetere tutto il codice che può essere consolidato in un unico posto.

    
risposta data 10.01.2013 - 22:04
fonte

Leggi altre domande sui tag