Va bene lanciare un'eccezione nel normale percorso del codice che elimina un possibile errore del programmatore? [duplicare]

1

So che l'eccezione dovrebbe essere generata in casi eccezionali (ad es. memoria insufficiente, errore del programmatore). In questi casi, non devo preoccuparmi delle prestazioni che generano queste eccezioni.

Ma cosa succede se si usa l'eccezione nel normale percorso del codice?

Nel mio caso, usalo per fermare la funzione fornita dal codice utente.

Quindi per un dato codice, foo è migliore o foo2 migliore?

È molto probabile che outputFunc restituisca l'eccezione false / throw.

// library provided function
void foo(std::function<void(std::function<bool(int)>)>);

// how user suppose to use it
foo([](std::function<bool(int)> outputFunc){
    while (/*condition*/)
    {
        // user have to check the return value and stop work when it return false
        if (!outputFunc(/*some value*/)) return; 
    }
});

// library provided function
void foo2(std::function<void(std::function<void(int)>)>);

// how user suppose to use it
foo2([](std::function<void(int)> outputFunc){
    while (/*condition*/)
    {
       // this will throw exception and handled internally when it should stop
       // user does not have to check the return value but they need to write exception-safe code
        outputFunc(/*some value*/));
    }
});

Nel mio caso, l'uso dell'eccezione elimina un possibile errore del programmatore (non controllando il valore di ritorno di outputFunc ) e rende il codice più facile da scrivere (non è necessario controllare il valore di ritorno)

E l'eccezione è throw / catch internamente, nessun codice utente richiesto per gestirli (eccetto che hanno bisogno di scrivere codice eccezionalmente sicuro nel lambda, ma dovremmo sempre scrivere codice eccezionalmente sicuro)

    
posta Bryan Chen 04.05.2014 - 03:30
fonte

1 risposta

0

Se una funzione non può fare ciò che deve fare e restituire un valore sarà fuorviante, allora lanciare un'eccezione sembra essere l'unica altra opzione.

Questa situazione non sarebbe mai possibile, e se dovesse accadere dovrebbe rappresentare un problema nell'ambiente del sistema o bug nel codice. Idealmente dovresti cercare di aggirare il problema eseguendo alcune prevalidazioni. Ad esempio, richiamare alcune funzioni per verificare se gli ingressi / stato sono validi per la funzione che si desidera realmente chiamare. Questa funzione di validazione restituirebbe un valore booleano e, a seconda del risultato, saprai se chiamare o meno la funzione desiderata.

    
risposta data 04.05.2014 - 05:04
fonte

Leggi altre domande sui tag