Zapewnienie, że wyjątki są zawsze сaught

głosy
21

Wyjątki w C ++ nie muszą być złowione (brak błędów w czasie kompilacji) przez funkcję wywołującego. Więc to do sądu dewelopera czy złapać je za pomocą try / catch (inaczej niż w Javie).

Czy istnieje sposób można zapewnić, że wyjątki rzucane są zawsze złowione przy użyciu try / catch przez funkcję dzwoni?

Utwórz 04/08/2008 o 11:01
źródło użytkownik
W innych językach...                            


7 odpowiedzi

głosy
22

Nie.

Zobacz pragmatyczne spojrzenie na specyfikacji wyjątków z powodów, dlaczego nie.

Jedynym sposobem można „pomóc” to udokumentować wyjątki czynność może rzucać, powiedzmy jako komentarz w pliku nagłówka deklarowania. To nie jest wymuszane przez kompilator lub cokolwiek. Użyj opinie kod do tego celu.

Odpowiedział 04/08/2008 o 11:10
źródło użytkownik

głosy
9

Nie powinno być za pomocą wyjątek tutaj. To oczywiście nie jest przypadek wyjątkowy, jeśli trzeba oczekiwać go wszędzie użyć tej funkcji!

Lepszym rozwiązaniem byłoby uzyskać funkcja zwraca instancję czegoś takiego. W debugowania buduje (programiści zakładając wykonywać ścieżki kodu oni właśnie napisane), będą mogły uzyskać assert jeśli zapomnij sprawdzić, czy operacja succeded czy 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_; }
}
Odpowiedział 24/09/2008 o 10:24
źródło użytkownik

głosy
4

Poza zakres swoje pytanie, więc nie dyskutowane opublikowania tego, ale w języku Java są faktycznie 2 rodzaje wyjątków, sprawdzone i niekontrolowany. Podstawową różnicą jest to, że, podobnie jak w c[++], nie trzeba złapać niesprawdzony wyjątek.

Dla dobrego odniesienia spróbować

Odpowiedział 04/08/2008 o 18:51
źródło użytkownik

głosy
2

Chris "prawdopodobnie najlepszą czystą odpowiedź na pytanie:

Jednak jestem ciekaw korzenia pytanie. Jeśli użytkownik powinien zawsze zawijać wywołanie w bloku try / catch, jeżeli funkcja użytkownik zwane naprawdę rzuca wyjątki w pierwszej kolejności?

Jest to trudne pytanie odpowiedzieć bez dalszych kontekście dotyczącej kodu bazy w pytaniu. Strzelanie z biodra, myślę, że najlepszą odpowiedzią jest tu zawinąć funkcję aż tak, że zaleca się (jeśli nie wyłącznie, w zależności od ogólnego stylu wyjątkiem kodu) public interface robi try / catch dla użytkownika. Jeśli jesteś po prostu staramy się upewnić, że nie ma nieobsłużonych wyjątków w kodzie, testy jednostkowe i przegląd kodu są prawdopodobnie najlepszym rozwiązaniem.

Odpowiedział 05/08/2008 o 05:56
źródło użytkownik

głosy
0

Był kiedyś próbą dodać dynamicznych specyfikacji wyjątków do podpisu funkcji, ale ponieważ język nie mógł egzekwować ich dokładność, zostali później amortyzowane.

W C ++ 11 i do przodu, mamy teraz specyfikator noexcept .
Ponownie, jeśli podpis jest oznaczony rzucać, nie ma jeszcze requriement że być obsługiwane przez rozmówcę.


W zależności od kontekstu, można zapewnić, że wyjątkowe zachowanie być obsługiwane przez kodowanie go do systemu typu.

Zobacz: std :: opcjonalnie jako części podstaw bibliotecznych.

Odpowiedział 08/05/2016 o 15:07
źródło użytkownik

głosy
0

Czy istnieje sposób można zapewnić, że wyjątki rzucane są zawsze złowione przy użyciu try / catch przez funkcję dzwoni?

Uważam to za dość zabawne, że tłum Java - w tym ja - stara się unikać sprawdzonych wyjątków. Starają się pracować drogę wokół zmuszany do połowu wyjątków za pomocą RuntimeExceptions .

Odpowiedział 04/08/2008 o 19:14
źródło użytkownik

głosy
0

Albo można zacząć rzucać krytycznych wyjątków. Z pewnością wyjątek naruszenie zasad dostępu będzie złapać uwagę użytkowników.

Odpowiedział 04/08/2008 o 18:33
źródło użytkownik

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