2010-04-29 26 views
5

Tôi đã xoay sở để vượt qua sự nghiệp lập trình C++ cho đến nay hầu như không bao giờ chạm vào ngoại lệ nhưng gần đây tôi đã làm việc trên một dự án với động cơ Ogre và tôi đang cố học đúng cách. Tôi đã tìm thấy rất nhiều câu hỏi và câu trả lời tốt ở đây về việc sử dụng chung của ngoại lệ C++ nhưng tôi muốn nhận được một số ý kiến ​​bên ngoài từ đây về việc sử dụng Ogre là tốt và cách tốt nhất để làm việc với họ.Việc sử dụng ngoại lệ của Ogre có phải là cách tốt để sử dụng chúng không?

Để bắt đầu, trích dẫn từ tài liệu của lớp Exception riêng của nó Ogre của:

OGRE không bao giờ sử dụng giá trị trả lại để chỉ ra sai sót. Thay vào đó, nếu một lỗi xảy ra, một ngoại lệ được ném ra, và đây là đối tượng đóng gói chi tiết của vấn đề. Ứng dụng sử dụng OGRE nên luôn luôn đảm bảo rằng các ngoại lệ bị bắt, vì vậy tất cả các chức năng của OGRE phải xuất hiện trong khối try {} catch (Ogre :: Exception & e) {}.

Thật sao? Mỗi hàm Ogre đơn lẻ có thể ném một ngoại lệ và được bao bọc trong khối try/catch? Hiện nay điều này được xử lý trong việc sử dụng nó bằng cách thử/nắm bắt trong chính sẽ hiển thị một hộp thông báo với mô tả ngoại lệ trước khi thoát. Điều này có thể hơi khó xử khi gỡ lỗi mặc dù bạn không nhận được dấu vết ngăn xếp, chỉ là hàm đã ném lỗi - quan trọng hơn là hàm từ mã của chúng tôi gọi là hàm Ogre. Nếu nó là một khẳng định trong mã Ogre thì nó sẽ đi thẳng vào mã trong trình gỡ lỗi và tôi có thể tìm hiểu điều gì đang diễn ra dễ dàng hơn nhiều - tôi không biết nếu tôi thiếu một thứ gì đó sẽ cho phép tôi gỡ lỗi ngoại lệ đã?

Tôi đang bắt đầu thêm một số khối try/catch khác trong mã của chúng tôi ngay bây giờ, thường nghĩ về việc liệu nó có quan trọng không nếu chức năng Ogre ném một ngoại lệ. Nếu nó là cái gì đó sẽ ngừng tất cả mọi thứ làm việc sau đó để cho các thử chính/bắt xử lý nó và thoát khỏi chương trình. Nếu nó không phải là rất quan trọng sau đó bắt nó chỉ sau khi cuộc gọi chức năng và để cho chương trình tiếp tục. Một ví dụ gần đây về việc này là xây dựng một vectơ của các tham số chương trình đỉnh/mảnh cho vật liệu được áp dụng cho thực thể - nếu vật liệu không có bất kỳ tham số nào thì nó sẽ ném một ngoại lệ, mà tôi bị bắt và bỏ qua vì nó đã không ' t cần phải thêm vào danh sách các tham số của tôi. Điều này có vẻ giống như một cách hợp lý để đối phó với mọi thứ? Bất kỳ lời khuyên cụ thể để làm việc với Ogre được đánh giá cao.

Trả lời

19

Bạn không cần phải gói mọi cuộc gọi cuối cùng cho Ogre theo số try { ... } catch. Bạn làm điều đó bất cứ nơi nào bạn có thể đối phó với ngoại lệ một cách có ý nghĩa. Điều này có thể tại trang web gọi cá nhân trong một số trường hợp, hoặc nó có thể ở trong một vòng lặp cấp cao của một số loại. Nếu bạn không thể đối phó với nó một cách có ý nghĩa ở bất kì đâu, đừng bắt nó chút nào; để cho trình gỡ lỗi tiếp quản.

Cụ thể, bạn không nên bắt ngoại lệ trong main() vì lý do chính đáng bạn trích dẫn (ít nhất, không phải trong quá trình phát triển; bạn nên sản xuất).

+6

+1 cho "Bất cứ nơi nào bạn có thể đối phó có ý nghĩa với ngoại lệ" – Yacoby

+0

Vì vậy, có ý nghĩa đối phó với ngoại lệ sẽ áp dụng cho ví dụ tìm kiếm thông số cuối cùng của tôi? Miễn là không có gì đã được sửa đổi trước khi ngoại lệ thì nó sẽ không gây ra bất kỳ vấn đề nào. ngày giờ chỉ ra cách gỡ lỗi ngoại lệ khi chúng được ném ra sẽ giúp ích rất nhiều, nếu tôi lấy thử/nắm bắt chính ở chế độ gỡ lỗi, điều gì sẽ xảy ra nếu ngoại lệ không bị bắt? – identitycrisisuk

+0

Khi ngoại lệ không bị bắt, trình gỡ lỗi sẽ bắt được trình gỡ lỗi và hiển thị cho bạn điểm mà nó được ném ra. – Christopher

6

Tôi không biết gì về Ogre, tôi sợ, nhưng quy tắc chung với xử lý ngoại lệ là bạn bắt được ngoại lệ càng xa càng tốt từ trang web ném, nhưng không xa hơn nữa. Tuy nhiên, điều này chỉ có thể xảy ra nếu mã ném ngoại lệ sử dụng RAII để xem xét các tài nguyên được cấp phát. Nếu mã sử dụng phân bổ động cho con trỏ đơn giản hoặc các hình thức quản lý tài nguyên thủ công khác, thì bạn cần phải thử các khối tại trang cuộc gọi. Nếu đây là trường hợp, tôi muốn nói sử dụng ngoại lệ là một ý tưởng tồi.

+0

Tôi nghĩ Ogre chủ yếu là ok từ một điểm phân bổ tài nguyên của chế độ xem, hầu hết nó sử dụng lớp con trỏ chia sẻ của riêng nó (mà chúng không khuyên bạn sử dụng lại mặc dù ...) và bạn có thể để nó dọn dẹp khi bạn không sử dụng công cụ nữa. – identitycrisisuk

6

Dường như bạn không biết cách gỡ lỗi ngoại lệ. Hoặc

  • Mang lên VS Debug/Exceptions thoại và đánh dấu vào Exceptions C++ hộp.Điều này sẽ cung cấp cho bạn một cơ hội (một hộp thoại xuất hiện) để gỡ lỗi khi một ngoại lệ được ném.

hoặc

  • Nếu bạn đã xây dựng nguồn Ogre, thiết lập một breakpoint trong constructor Ogre::Exception và khi nó cố gắng để ném một bạn sẽ phá vỡ với một chồng gọi nơi cấp độ tiếp theo lên là trang web ném.
+0

Cảm ơn rất nhiều, tôi biết có gì đó nhưng không thể tìm thấy nó. Nên có suy nghĩ của breakpoint constructor quá. – identitycrisisuk

Các vấn đề liên quan