Domanda

Le eccezioni in C++ non devono essere rilevate (nessun errore in fase di compilazione) dalla funzione chiamante.Quindi spetta al giudizio dello sviluppatore se catturarli utilizzando try/catch (a differenza di Java).

Esiste un modo per garantire che le eccezioni generate vengano sempre rilevate utilizzando try/catch dalla funzione chiamante?

È stato utile?

Soluzione

NO.

Vedere Uno sguardo pragmatico alle specifiche delle eccezioni per ragioni perché no.

L'unico modo per "aiutare" questo è documentare le eccezioni che la tua funzione può generare, ad esempio come commento nel file di intestazione che lo dichiara.Questo non è imposto dal compilatore o altro.Utilizzare le revisioni del codice a tale scopo.

Altri suggerimenti

Non dovresti usare un'eccezione qui.Questo ovviamente non è un caso eccezionale se devi aspettartelo ovunque usi questa funzione!

Una soluzione migliore sarebbe fare in modo che la funzione restituisca un'istanza di qualcosa di simile.Nelle build di debug (supponendo che gli sviluppatori esercitino i percorsi di codice che hanno appena scritto), riceveranno un'asserzione se si dimenticano di verificare se l'operazione è riuscita o meno.

class SearchResult
{
  private:
    ResultType result_;
    bool succeeded_;
    bool succeessChecked_;

  public:
    SearchResult(Result& result, bool succeeded)
      : result_(result)
      , succeeded_(succeeded)
      , successChecked_(false)
    {
    }

    ~SearchResult()
    {
      ASSERT(successChecked_);
    }

    ResultType& Result() { return result_; }
    bool Succeeded() { successChecked_ = true; return succeeded_; }
}

Al di fuori dell'ambito della tua domanda, quindi ho discusso di non pubblicarlo, ma in Java ci sono in realtà 2 tipi di eccezioni, selezionate e deselezionate.La differenza fondamentale è che, proprio come in c[++], non è necessario rilevare un'eccezione non controllata.

Per un buon riferimento prova questo

Chris' probabilmente ha la migliore risposta pura alla domanda:

Tuttavia, sono curioso di conoscere la radice della domanda.Se l'utente dovrebbe Sempre avvolgere la chiamata in un blocco try/catch, la funzione chiamata dall'utente dovrebbe davvero lanciare eccezioni in primo luogo?

Questa è una domanda difficile a cui rispondere senza ulteriore contesto riguardante la base di codice in questione.Partendo dall'anca, penso che la risposta migliore qui sia quella di concludere la funzione in modo tale che l'interfaccia pubblica consigliata (se non solo, a seconda dello stile di eccezione generale del codice) esegua il try/catch per l'utente.Se stai solo cercando di assicurarti che non vi siano eccezioni non gestite nel tuo codice, gli unit test e la revisione del codice sono probabilmente la soluzione migliore.

Esiste un modo in cui si può garantire che le eccezioni lanciate vengano sempre catturate usando il tentativo/cattura dalla funzione chiamante?

Trovo piuttosto divertente che il pubblico di Java... me compreso - sta cercando di evitare le eccezioni controllate.Stanno cercando di aggirare l'obbligo di rilevare le eccezioni utilizzando RuntimeException.

C'è stato una volta un tentativo di aggiungere specifiche delle eccezioni dinamiche alla firma di una funzione, ma poiché il linguaggio non poteva garantirne l'accuratezza, furono successivamente svalutati.

In C++11 e versioni successive, ora abbiamo il file noeccetto specificatore.
Ancora una volta, se la firma è contrassegnata per essere lanciata, non è ancora necessario che venga gestita dal chiamante.


A seconda del contesto, è possibile garantire che il comportamento eccezionale venga gestito codificandolo nel sistema di tipi.

Vedere: std::opzionale come parte dei fondamenti della biblioteca.

Oppure potresti iniziare a lanciare eccezioni critiche.Sicuramente, un'eccezione di violazione di accesso lo farà presa l'attenzione dei tuoi utenti.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top