2010-04-29 9 views
5

Udało mi się przejść przez moją karierę programistyczną w C++ do tej pory praktycznie nigdy nie dotykając wyjątków, ale ostatnio pracowałem nad projektem z silnikiem Ogre i staram się właściwie uczyć. Znalazłem tu wiele dobrych pytań i odpowiedzi na temat ogólnego użycia wyjątków C++, ale chciałbym uzyskać stąd opinie zewnętrzne na temat tego, czy użycie Ogre jest dobre i jak najlepiej z nimi pracować.Czy używanie wyjątków przez Ogre jest dobrym sposobem ich użycia?

Na początek, cytując z dokumentacji Ogre z jego własnym klasy Exception:

OGRE nigdy nie używa wartości zwracanych do wskazania błędów. Zamiast tego, jeśli wystąpi błąd, zostanie zgłoszony wyjątek i jest to obiekt, który zawiera szczegóły problemu. Aplikacja wykorzystująca OGRE powinna zawsze zapewnić, że wyjątki zostaną przechwycone, więc wszystkie funkcje silnika OGRE powinny wystąpić w bloku try {} catch (Ogre :: Exception & e) {}.

Naprawdę? Każda funkcja Ogre może rzucić wyjątek i zostać zapakowana w blok try/catch? W chwili obecnej jest to obsługiwane w naszym korzystaniu z niego przez try/catch w głównym, który wyświetli okno komunikatu z opisem wyjątku przed wyjściem. Może to być nieco kłopotliwe przy debugowaniu, ponieważ nie dostajesz śladu stosu, tylko funkcja, która rzuciła błąd - ważniejsza jest funkcja z naszego kodu, która nazywa się funkcja Ogre. Gdyby był to kod w Ogre, to trafiłby prosto do kodu w debugerze i byłbym w stanie dowiedzieć się, co jest łatwiejsze - nie wiem, czy brakuje mi czegoś, co pozwoliłoby mi debugować wyjątki już?

Zaczynam dodać jeszcze kilka bloków try/catch w naszym kodzie teraz, zazwyczaj myśli o tym, czy to ma znaczenie, jeśli funkcja Ogre zgłasza wyjątek. Jeśli jest to coś, co zatrzyma wszystko, co działa, pozwól, aby główny try/catch poradził sobie z nim i wyjdź z programu. Jeśli nie ma to większego znaczenia, złap go zaraz po wywołaniu funkcji i pozwól programowi kontynuować. Jednym z ostatnich przykładów tego było budowanie wektora parametrów programu wierzchołków/fragmentów dla materiałów zastosowanych do obiektu - jeśli materiał nie miał żadnych parametrów, to rzuciłby wyjątek, który złapałem, a następnie zignorowałem, ponieważ nie było ". t potrzeba dodać do mojej listy parametrów. Czy wydaje się to rozsądnym sposobem radzenia sobie z rzeczami? Wszelkie cenne porady dotyczące pracy z Ogrem są bardzo doceniane.

Odpowiedz

19

Nie trzeba owinąć każdą ostatnią wezwanie do Ogre w try { ... } catch. Robisz to wszędzie, gdzie możesz w znaczący sposób poradzić sobie z wyjątkiem. Może to być w niektórych przypadkach na stronie z pojedynczym wywołaniem lub może być w jakiejś pętli wysokiego poziomu. Jeśli nie możesz sobie z tym poradzić w sensie nigdzie, nie łapaj go w ogóle; pozwól na przejęcie debuggera.

W szczególności nie powinieneś łapać wyjątków w main() z dokładnie tego powodu, który cytujesz (przynajmniej nie w trakcie rozwoju, powinieneś w produkcji).

+6

+1 za "Gdziekolwiek można sensownie poradzić sobie z wyjątkiem" – Yacoby

+0

Więc sensownie zajmowanie się wyjątkiem dotyczy mojego ostatniego przykładu znajdowania parametrów? Dopóki nic nie zostanie zmodyfikowane przed wyjątkiem, nie spowoduje żadnych problemów. w dniu dzisiejszym wskazał, jak debugować wyjątki, gdy są one rzucane, co bardzo pomoże, jeśli wyjdę z głównego try/catch w trybie debugowania, co się stanie, jeśli wyjątki nie zostaną przechwycone? – identitycrisisuk

+0

Gdy wyjątki nie zostaną przechwycone, debugger go złapie i wyświetli punkt, z którego został wywołany. – Christopher

6

ja nie wiem nic o Ogre, obawiam się, ale ogólna zasada z obsługi wyjątków jest to, że można złapać wyjątek jak najdalej od miejsca rzutów, ale nie dalej. Jest to jednak możliwe tylko wtedy, gdy kod, który zgłasza wyjątek, korzysta z RAII do obsługi przydzielonych zasobów. Jeśli kod używa alokacji dynamicznej do zwykłych wskaźników lub innych form ręcznego zarządzania zasobami, potrzebujesz bloków try-na stronie wywołania. Jeśli tak jest, powiedziałbym, że używanie wyjątków to zły pomysł.

+0

Myślę, że Ogre jest w większości w porządku z z punktu widzenia alokacji zasobów, większość z nich korzysta z własnej udostępnionej klasy wskaźnika (której nie zalecamy, aby ponownie użyć ...) i możesz zostawić ją do czyszczenia, gdy nie będziesz już używać rzeczy. – identitycrisisuk

6

Wydajesz się być nieświadomi jak debugować wyjątki. Albo

  • Wywołaj VS Debug/wyjątki okno i zaznaczyć wyjątki C++ pudełko.Da ci to możliwość (pojawi się okno dialogowe) do debugowania, gdy zostanie zgłoszony wyjątek .

lub

  • Jeśli zbudowany Ogre źródło, ustaw przerwania w konstruktorze Ogre::Exception a gdy próbuje rzucić jedną złamiesz z stos wywołania gdzie następny poziom do góry jest strona rzutu.
+0

Wielkie dzięki, wiedziałem, że będzie coś, ale nie mogę go znaleźć. Powinien również myśleć o punkcie przerwania konstruktora. – identitycrisisuk

Powiązane problemy