Sikre at Unntak er alltid fanget

stemmer
22

Unntak i C ++ trenger ikke å bli fanget (ingen kompilering feil) av telefonfunksjonen. Så det er opp til utbygger dom om å fange dem ved hjelp av forsøk / fangst (i motsetning til i Java).

Er det en måte man kan sikre at unntakene kastet alltid fanget ved hjelp av prøve / fangst av telefonfunksjonen?

Publisert på 04/08/2008 klokken 10:01
kilden bruker
På andre språk...                            


7 svar

stemmer
23

Nei.

Se en pragmatisk titt på Unntaks Spesifikasjoner grunner hvorfor ikke.

Den eneste måten du kan "hjelpe" dette er å dokumentere unntakene din funksjon kan kaste, si som en kommentar i tekstfilen erklære det. Dette er ikke håndheves av kompilatoren eller noe. Bruk kode anmeldelser for dette formålet.

Svarte 04/08/2008 kl. 10:10
kilden bruker

stemmer
9

Du bør ikke være å bruke et unntak her. Dette er åpenbart ikke et enestående tilfelle hvis du trenger å være venter det overalt du bruker denne funksjonen!

En bedre løsning ville være å få funksjonen til å returnere en forekomst av noe som dette. I debug bygger (forutsatt utviklerne utviser kode stier de nettopp har skrevet), vil de få en hevde hvis de glemmer å sjekke om operasjonen lyktes eller ikke.

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_; }
}
Svarte 24/09/2008 kl. 09:24
kilden bruker

stemmer
4

Utenfor omfanget av spørsmålet ditt, så jeg ikke diskutert poste dette, men i Java er det faktisk 2 typer unntak, kontrollert og ukontrollert. Den grunnleggende forskjellen er at mye som i c[++], du ikke trenger å ta en ukontrollert unntak.

For en god referanse prøve dette

Svarte 04/08/2008 kl. 17:51
kilden bruker

stemmer
2

Chris 'har trolig den beste rene svaret på spørsmålet:

Men jeg er nysgjerrig på roten av spørsmålet. Hvis brukeren skal alltid brytes samtalen i en prøve / catch-blokken, skal brukeren såkalte funksjons virkelig være å kaste unntak i første omgang?

Dette er et vanskelig spørsmål å svare på uten mer kontekst om kodebasen i spørsmålet. Skyte fra hoften, tror jeg det beste svaret her er å vikle funksjonen opp slik at den anbefalte (hvis ikke bare avhengig av den generelle unntak stilen av koden) felles grensesnitt gjør prøve / fangst for brukeren. Hvis du bare prøver å sikre at det ikke er noen Ubehandlede unntak i koden din, enhet tester og kode gjennomgang er sannsynligvis den beste løsningen.

Svarte 05/08/2008 kl. 04:56
kilden bruker

stemmer
0

Det var en gang et forsøk på å legge til dynamiske unntaks spesifikasjoner til en funksjon signatur, men ettersom språket ikke kunne håndheve deres nøyaktighet, ble de senere avskrevet.

I C ++ 11 og fremover, har vi nå noexcept Specifier .
Igjen, hvis signaturen er merket for å kaste, er det fortsatt ikke requriement at det håndteres av den som ringer.


Avhengig av konteksten, kan du sikre at eksepsjonell oppførsel håndteres ved koding den inn i type system.

Se: std :: valgfritt som en del av bibliotekgrunnleggende.

Svarte 08/05/2016 kl. 15:07
kilden bruker

stemmer
0

Er det en måte man kan sikre at unntakene kastet alltid fanget ved hjelp av prøve / fangst av telefonfunksjonen?

Jeg synes det er ganske morsomt at Java publikum - inkludert meg selv - prøver å unngå sjekket Unntak. De prøver å jobbe seg rundt å bli tvunget til å fange Unntak ved hjelp RuntimeExceptions .

Svarte 04/08/2008 kl. 18:14
kilden bruker

stemmer
0

Eller du kan begynne å kaste kritiske unntak. Sikkert, vil et brudd på tilgangs unntak fange brukernes oppmerksomhet.

Svarte 04/08/2008 kl. 17:33
kilden bruker

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more