Vă mulțumim pentru susținere

Asigurați-vă că excepțiile sunt întotdeauna?

Excepțiile în C ++ nu trebuie să fie prinse (fără erori de timp de compilare) de către funcția de apelare. Deci, este de până la judecătorul dezvoltatorului dacă să le prindă folosind try / catch (spre deosebire de Java).

Există o modalitate prin care se pot asigura că excepțiile aruncate sunt întotdeauna prinse folosind încercarea / prinderea de către funcția de apelare?

0
adăugat editat
Consensul privind abordarea procurată a Java față de specificațiile de excepție este că este prost rănit.
adăugat autor Pete Becker

7 răspunsuri

Nu.

Consultați O privire pragmatică asupra specificațiilor de excepție din motive de ce nu.

Singurul mod în care puteți să "ajutați" acest lucru este să documentați excepțiile pe care le poate arunca funcția dvs., spunând ca un comentariu în fișierul antetului care îl declară. Acest lucru nu este impus de compilator sau orice altceva. Utilizați recenzii de cod în acest scop.

0
adăugat

În afara domeniului de aplicare a întrebării dvs., așa că am dezbătut nu postarea, dar în Java există de fapt două tipuri de excepții, verificate și neconfirmate. Diferența de bază este că, la fel ca în c [++] , nu trebuie să prindeți o excepție neconfirmată.

Pentru o referință bună, încercați acest lucru

0
adăugat

Sau puteți începe să aruncați excepții critice. Cu siguranță, o excepție de încălcare a accesului va atrage atenția atenției utilizatorilor.

0
adăugat
Dacă ați citit trecutul, ați fi observat că am menționat în mod explicit unul.
adăugat autor Ryan Fox
Ce, praytell, este o excepție "critică"?
adăugat autor John Dibling

Nu ar trebui să utilizați o excepție aici. Acest lucru, evident, nu este un caz excepțional dacă trebuie să vă așteptați oriunde ați folosi această funcție!

O soluție mai bună ar fi să obții funcția de a returna un exemplu de așa ceva. În construirea de depanare (presupunând că dezvoltatorii dau cursuri de coduri pe care tocmai le-au scris), vor obține o afirmație dacă uită să verifice dacă operațiunea a reușit sau nu.

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_; }
}
0
adăugat
GCC are cel puțin un atribut de funcție care necesită manipularea valorii returnate. Mai puțin murdar decât acest extra bool.
adăugat autor Zan Lynx
@JohnDibling Arată-mi pe cineva serios care nu-l spune.
adăugat autor James Kanze
Din această clasă lipsește un constructor de copie și un operator de atribuire. Constructorul de copiere este foarte important, deoarece valorile sunt returnate prin copie (care poate fi elizată). În C ++ 11, probabil că doriți un constructor de mutare, mai degrabă decât un constructor de copiere, deoarece doriți să resetați successChecked în obiectul care este copiat.
adăugat autor James Kanze
Arătați-mi un exemplu de cineva care nu este un vrăjitor sau un hack spunând că excepțiile sunt numai pentru situații excepționale.
adăugat autor John Dibling
+1 pentru asta. Dacă vă așteptați la un rezultat, acesta nu ar trebui returnat sub forma unei excepții.
adăugat autor macbirdie
@JohnDibling Am auzit acest lucru foarte mult de la dezvoltatorii de Java, dar încă am auzit / văd acele cuvinte exacte de la orice cărți, referințe sau dezvoltatori notabili. Dacă da, atunci creatorul (i) Python nu a primit memo :)
adăugat autor Jason Mock

A existat o dată o încercare de a adăuga specificații dinamice de excepție în semnatura unei funcții, limba nu le-a putut impune acuratețea, au fost ulterior depreciate.

În C ++ 11 și înainte, acum avem specificatorul noexcept .
Din nou, dacă semnătura este marcată pentru a arunca, nu există încă cerința ca aceasta să fie gestionată de apelant.


În funcție de context, puteți asigura că un comportament excepțional poate fi gestionat prin codarea acestuia în sistemul de tip.

See: std::optional as part of the library fundamentals.

0
adăugat

Există o modalitate de a ne asigura că   excepțiile aruncate sunt întotdeauna prinse   folosind încercarea / prinderea de către apelant   Funcția?

Mi se pare destul de amuzant, că mulțimea Java - inclusiv pe mine - încearcă să evite Excepțiile verificate. Ei încearcă să-și facă drumul prin a fi forțați să captureze Excepții utilizând RuntimeExceptions .

0
adăugat

Chris' probably has the best pure answer to the question:

Cu toate acestea, sunt curios de rădăcina întrebării. Dacă utilizatorul ar trebui să întotdeauna să înfășoare apelul într-un bloc de încercare / captură, ar trebui ca funcția numită de utilizator să arunce cu adevărat excepții în primul rând?

Aceasta este o problemă dificilă de a răspunde fără un context mai aprofundat în ceea ce privește baza de date în cauză. Fotografiile de la șold cred că cel mai bun răspuns aici este să înfășurați funcția astfel încât interfața publică recomandată (dacă nu numai, în funcție de stilul excepțional al codului) să facă încercarea / captura pentru utilizatorul. Dacă încercați doar să vă asigurați că nu există excepții nefolosite în codul dvs., testele de unitate și revizuirea codului sunt probabil cea mai bună soluție.

0
adăugat