Я делаю простую игру в Unity. Поскольку время ограничено, я не пишу модульные тесты. Вместо этого я активно использую утверждения (Debug.Assert
) и исключения, чтобы гарантировать корректность моей игровой логики.
Однако механизм, на который я полагаюсь для обеспечения правильности, полностью разрушен самым разочаровывающим дизайнерским решением Unity — он перехватывает все исключения и утверждения и печатает их в журнале. Затем он продолжает выполнение игры, как будто ничего не произошло.
Такой выбор Unity делает совершенно невозможным следующие вещи:
Отсюда мой вопрос: как помешать Unity сделать это?
В Visual Studio Debug -> Windows -> Exception Settings
заставьте отладчик немедленно прерывать работу в случае возникновения исключения, независимо от того, может ли оно быть обработано или нет.
Однако, поскольку Unity сама по себе не заботится (поясню: возможно, она перехватывается и игнорируется) некоторыми исключениями, выдаваемыми сама по себе, всякий раз, когда я отлаживаю свою программу таким образом, я сначала буду перегружен исключениями, выдаваемыми движком Unity. Так что, к сожалению, это не сработает.
@shingo Я попробовал System.Diagnostics
, прежде чем задать вопрос, но это тоже не сработало. Кроме того, некоторая проверка ошибок выполняется в исключениях, а не в утверждениях.
После тщательного поиска в Интернете мне пришлось в конечном итоге реализовать свою собственную функцию утверждения и заменить все существующие фатальные исключения, выданные этим утверждением, как предложил @shingo в комментарии.
Хотя таким образом я теряю тип исключений, по крайней мере, отладчик остановит игру, если что-то пойдет не так.
public static void MyDebugAssert(bool condition, String msg = "")
{
if (!condition)
{
Debugger.Break();
Debugger.Log(0, "Assertion", "Debug Assertion Failed!\n" + msg);
//ExitProcess(-1);
Application.Quit(-1);
}
}
Тем не менее, у этого есть серьезный недостаток --- Все исключения, вызванные другими моими ошибками, например NullReferenceException
, все равно будут игнорироваться. Эти исключения обычно возникают, когда я забыл что-то инициализировать или правильно настроить.
Я хотел бы продолжить расследование, но, как я уже говорил в вопросе, у меня ограничено время для реализации этой игры, поэтому я пока буду работать таким образом.
UnityEngine.Debug.Assert
не создает никаких исключений. ИспользуйтеSystem.Diagnostics.Debug
, в режиме отладки он автоматически сломает отладчик по умолчанию. Или вы можете использовать собственную реализацию Assert и отфильтровать конкретное исключение.