Действительно ли использование Людоедом Исключений является хорошим способом использовать их?

Мне удалось пройти через мою игровую карьеру программирования C++ до сих пор фактически никогда касающиеся исключения, но недавно я работал над проектом с механизмом Людоеда, и я пытаюсь учиться правильно. Я нашел много хороших вопросов и ответов здесь на общем использовании исключений C++, но я хотел бы получить некоторые внешние мнения отсюда о том, хорошо ли использование Людоеда и как лучше всего работать с ними.

Прежде всего, заключая в кавычки из документации Людоеда Класс исключений сам по себе:

ЛЮДОЕД никогда не использует возвращаемые значения для указания на ошибки. Вместо этого если ошибка происходит, исключение выдается, и это - объект, который инкапсулирует деталь проблемы. Приложение с помощью ЛЮДОЕДА должно всегда гарантировать, что исключения пойманы, таким образом, все функции механизма ЛЮДОЕДА должны произойти в рамках попытки {} выгода (Людоед:: Exception& e) {} блок.

В самом деле? Каждая функция Людоеда могла выдать исключение и быть перенесена в блок попытки/выгоды? В настоящее время это обрабатывается в нашем использовании его попыткой/выгодой в основном, которое покажет окно сообщения с описанием исключения перед выходом. Это может быть немного неловким для отладки, хотя, поскольку Вы не получаете отслеживание стека, просто функция, которая бросила ошибку - более важный, является функцией из нашего кода, который вызвал функцию Людоеда. Если бы это было утверждение в коде Людоеда затем, то это перешло бы прямо к коду в отладчике, и я смогу узнать то, что продолжается намного легче - я не знаю, пропускаю ли я что-то, что позволило бы мне уже отладить исключения?

Я начинаю добавлять еще несколько блоков попытки/выгоды в нашем коде теперь, обычно думая о том, имеет ли значение, если функция Людоеда выдает исключение. Если это - что-то, что остановится, все работающее затем позволило основной попытке/выгоде обработать его и выйти из программы. Если это не очень важно, затем ловят его сразу после вызова функции и позволяют программе продолжиться. Один недавний пример этого рос, вектор параметров программы вершины/фрагмента для материалов относился к объекту - если бы материал не имел никаких параметров затем, то он выдал бы исключение, которое я поймал и затем проигнорировал, поскольку он не должен был добавлять к моему списку параметров. Это походит на разумный способ иметь дело с вещами? Любой определенный совет для работы с Людоедом очень ценится.

5
задан identitycrisisuk 29 April 2010 в 11:24
поделиться

3 ответа

Вам не нужно заключать каждый последний вызов Ogre в try {...} catch . Вы делаете это везде, где можете осмысленно разобраться с исключением. В некоторых случаях это может быть отдельная точка вызова или какая-то петля высокого уровня. Если вы нигде не можете осмысленно разобраться с этим, не ловите его вообще; пусть берет на себя отладчик.

В частности, вы не должны перехватывать исключения в main () именно по той причине, которую вы указываете (по крайней мере, не во время разработки; вы должны это делать в производственной среде).

19
ответ дан 18 December 2019 в 05:39
поделиться

Боюсь, я ничего не знаю об Ogre, но общее правило обработки исключений состоит в том, что вы ловите исключение как можно дальше от закинуть сайт, но не дальше. Однако это возможно только в том случае, если код, генерирующий исключение, использует RAII для отслеживания выделенных ресурсов. Если в коде используется динамическое распределение для простых указателей или другие формы ручного управления ресурсами, тогда вам понадобятся блоки try на сайте вызова. Если это так, я бы сказал, что использование исключений - плохая идея.

6
ответ дан 18 December 2019 в 05:39
поделиться

Кажется, вы не знаете, как отлаживать исключения. Либо

  • Откройте VS Debug / Exceptions и установите флажок "Исключения C ++" . Это даст вам возможность (появляется диалоговое окно) для отладки при возникновении исключения .

или

  • Если вы создали исходный код Ogre, установите точку останова в конструкторе Ogre :: Exception , и когда он попытается выбросить его, вы ' Я разорву стек вызовов, где следующий уровень - это место выброса.
6
ответ дан 18 December 2019 в 05:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: