Vra

Uitsonderings in C ++ hoef nie gevang word (geen kompilering foute) deur die roeping funksie. So dit is aan oordeel ontwikkelaar se of om hulle te vang met behulp van drie / vangs (anders as in Java).

Is daar 'n manier kan 'n mens seker maak dat die gegooi uitsonderings altyd gevang met behulp van drie / vangs deur die roeping funksie?

Was dit nuttig?

Oplossing

Geen.

'n pragmatiese Kyk na Uitsondering Spesifikasies vir redes hoekom nie.

Die enigste manier wat jy kan "help" dit is om die uitsonderings jou funksie kan gooi dokumenteer, sê as 'n kommentaar in die kop lêer verklaar dit. Dit is nie afgedwing deur die samesteller of enigiets. Gebruik kode resensies vir daardie doel.

Ander wenke

Jy moet nie met behulp van 'n uitsondering hier. Dit is natuurlik nie 'n uitsonderlike geval as jy nodig het om te word verwag dat dit oral waar jy hierdie funksie te gebruik!

'n beter oplossing sou wees om die funksie om 'n instansie terugkeer van so iets kry. In debug bou (met die aanvaarding ontwikkelaars te oefen kode paaie hulle net geskryf het), sal hulle 'n Assert kry as hulle vergeet om te kyk of die operasie succeded of nie.

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_; }
}

Buite die omvang van jou vraag so ek bespreek nie hierdie plaas, maar in Java daar eintlik 2 tipes van uitsonderings, nagegaan en afgeskakel. Die basiese verskil is dat, net soos in c[++], jy hoef nie 'n ongehinderd uitsondering vang.

Vir 'n goeie verwysing probeer hierdie

Chris 'het waarskynlik die beste suiwer antwoord op die vraag:

Maar ek is nuuskierig oor die wortel van die vraag. As die gebruiker moet altyd draai die oproep in 'n drie / vangs blok, moet die gebruiker genoem funksie werklik gooi uitsonderings in die eerste plek?

Dit is 'n moeilike vraag om te beantwoord sonder om meer konteks met betrekking tot die kode-basis in vraag. Skiet uit die heup, ek dink die beste antwoord hier is om die funksie draai so dat die aanbevole (indien nie alleen nie, afhangende van die algehele uitsondering styl van die kode) openbare koppelvlak doen die drie / vangs vir die gebruiker. As jy net probeer om te verseker dat daar geen verwerkte uitsonderings in jou kode, eenheid toetse en kode hersiening is waarskynlik die beste oplossing.

  

Is daar 'n manier kan 'n mens seker maak dat die   uitsonderings gegooi is altyd gevang   met behulp van drie / vangs deur die roeping   funksie?

Ek vind dit nogal snaaks dat die Java skare - insluitende myself - probeer om nagegaan Uitsonderings vermy. Hulle probeer om hul pad om gedwing om uitsonderings te vang deur die gebruik van RuntimeExceptions .

Daar was eens 'n poging om by te voeg dinamiese uitsondering spesifikasies om handtekening 'n funksie se , maar aangesien die taal van hul akkuraatheid nie kon dwing, hulle is later afgeskryf.

In C ++ 11 en vorentoe, ons het nou die noexcept specific .
Weereens, as die handtekening gemerk te gooi, is daar nog nie requriement dat dit deur die oproeper hanteer.


Na gelang van die konteks, kan jy verseker dat uitsonderlike gedrag deur kodering dit in die tipe stelsel hanteer word.

Sien: st :: opsionele as deel van die biblioteek grondbeginsels.

Of jy kan begin gooi kritieke uitsonderings. Sekerlik, 'n toegang fout uitsondering sal vangs aandag van jou gebruikers.

Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top