2010-04-29 3 views
5

저는 지금까지 C++ 게임 프로그래밍 경력을 쌓아 왔지만 실제로 예외를 만지지는 못하지만 최근에는 오우거 엔진을 사용하여 프로젝트를 진행했으며 제대로 배우려고합니다. C++ 예외의 일반적인 사용법에 대한 많은 좋은 질문과 답변을 여기에서 찾았지만 Ogre의 사용법이 좋은지, 어떻게 사용하는 것이 가장 좋은지에 대한 외부의 의견을 듣고 싶습니다. 오우거 (Ogre)의 예외 사용은 좋은 방법인가?

는 자신의 예외 클래스의 오우거의 문서를 인용, 시작하려면 :

괴물 오류를 나타내는 반환 값을 사용하지 않습니다. 대신에 오류가 발생하면 예외가 throw되며 이는 문제의 세부 사항을 캡슐화하는 객체입니다. OGRE를 사용하는 응용 프로그램은 항상 예외가 catch되는지 확인해야하므로 모든 OGRE 엔진 함수는 try {} catch (Ogre :: Exception & e) {} 블록 내에서 발생해야합니다.

정말요? 모든 오우거 함수는 예외를 throw하고 try/catch 블록에 래핑 될 수 있습니까? 현재 이것은 try/catch in main에 의해 사용되며, 종료 전에 예외 설명이있는 메시지 상자가 표시됩니다. 디버깅에는 약간의 어색함이있을 수 있습니다. 스택 추적을 얻지 못했을 때 오류를 던진 함수가 더 중요합니다. 오우거 함수라는 코드의 함수가 더 중요합니다. 오우거 코드에서 어설 션이라면 바로 디버거의 코드로 간다. 그리고 나는 훨씬 더 쉽게 진행되는 것을 발견 할 수있을 것이다. 이미 예외를 디버그합니까?

이제 Ogre 함수가 예외를 throw하면 문제가되는지 여부에 대해 일반적으로 생각하는 코드에 try/catch 블록을 추가하기 시작합니다. 모든 것이 작동을 멈추게 할만한 것이라면 메인 트릭/캐치가 처리하고 프로그램을 종료하도록하십시오. 중요하지 않은 경우 함수 호출 바로 다음에 catch하고 프로그램을 계속 진행하십시오. 최근의 한 가지 예는 엔티티에 적용된 재질에 대한 정점/조각 프로그램 매개 변수의 벡터를 작성하는 것입니다. 재료에 매개 변수가없는 경우 예외가 발생하면이를 잡아내어 무시했습니다. 내 매개 변수 목록에 추가 할 필요가 없습니다. 이것은 사물을 다루는 합리적인 방법처럼 보입니까? 오우거 작업에 대한 구체적인 조언을 많이 주시면 감사하겠습니다.

답변

19

오우거에게 마지막으로 호출 할 때마다 try { ... } catch에 랩핑하지 않아도됩니다. 당신이 의미있는 예외를 다룰 수있는 곳이라면 어디든 할 수 있습니다. 어떤 경우에는 개별 통화 사이트에있을 수도 있고 일부 높은 수준의 루프에있을 수도 있습니다. 의미있게 어디서나 다룰 수 없다면 전혀 잡지 마십시오. 디버거가 인계 받도록하십시오.

특히, 사용자가 인용 한 이유 (정확히 말하면 개발 중에 아니며 프로덕션 환경에 있어야 함)에 대한 예외 사항을 발견하면 안됩니다. main().

+6

+1 "예외로 의미가 있든 어디에서라도 처리 할 수 ​​있습니다." – Yacoby

+0

매개 변수를 찾는 마지막 예제에 예외가 적용됩니다. 예외가 일어나기 전에 아무 것도 수정되지 않으면 문제가 발생하지 않습니다. timday는 던져 질 때 예외를 디버깅하는 방법을 많이 지적합니다. 디버깅 모드에서 기본 try/catch를 꺼내면 예외가 잡히지 않으면 어떻게 될까요? – identitycrisisuk

+0

예외가 잡히지 않으면 디버거가이를 catch하고 던져진 지점을 표시합니다. – Christopher

6

나는 오우거에 대해 아무것도 몰라, 나는 두렵다. 그러나 예외 처리를하는 일반적인 규칙은 예외 사이트를 가능한 멀리 던져 버리는 것이지만 더 이상은 없다. 그러나 예외를 throw하는 코드에서 RAII를 사용하여 할당 된 리소스를 살펴본 경우에만 가능합니다. 코드에서 일반 포인터에 대한 동적 할당이나 다른 형태의 수동 리소스 관리를 사용하는 경우 호출 사이트에서 try 블록을 사용해야합니다. 이 경우 예외 사용은 나쁜 생각이라고 말하고 싶습니다.

+0

오우거는 대부분 괜찮습니다. 보기의 자원 할당 지점, 그것의 대부분은 자신의 공유 포인터 클래스 (그들은 당신이 비록 재사용을 권장하지 않습니다 ...)를 사용하고 일단 당신이 더 이상 물건을 사용하지 않으면 정리하기 위해 그것을 남길 수 있습니다. – identitycrisisuk

6

예외를 디버깅하는 방법을 알지 못하는 것처럼 보입니다. 어느

  • 은 VS 디버그/예외 대화 상자가 표시 및 C++ 예외를 상자을 선택합니다.그러면 예외가 발생했을 때 디버그 할 수있는 기회 (대화 상자가 나타납니다)가 표시됩니다.

또는 내장 한 경우

  • 오우거 소스는 Ogre::Exception 생성자에 중단 점을 설정하고 하나를 던져하려고 할 때 당신은 와 호출 스택을 깰 볼 수있는 곳 다음 단계 위로 던지 사이트입니다.
+0

고마워, 나는 뭔가있을 거라는 것을 알았지 만 그것을 찾을 수 없었다. 생성자 중단 점도 고려해야합니다. – identitycrisisuk

관련 문제