Я разрабатываю приложение для iOS, которое недавно расширило большую базу C++. C++ не моя сильная сторона, и я расстраиваюсь из-за исключений. То, что я ищу, - это способ получить дорожку стека на сайт (необработанного) исключения. Я скажу, что квалификатор «необработанный» необязателен; Я бы остановился на любом исключении в крайнем случае, хотя необработанные исключения идеальны.
То, что я сейчас получаю, бесполезно.Предполагая, что у меня нет подходящих обработчиков исключений выше по стеку вызовов, я делаю что-то вроде
std::vector<int> my_vector;
my_vector.at(40) = 2; // Throws std::out_of_range
Приложение сломается main()
, и я получу сообщение в журнале, в котором говорится: исключение." Не полезно.
Размещение общих блоков try/catch выше в стеке вызовов также не помогает, потому что стек вызовов раскручивается во время обработки исключения до точки блока catch, оставляя меня в неведении о фактическом происхождении исключения. Это также относится к предоставлению моего собственного terminate_handler
. Утверждения более полезны, но они требуют, чтобы я в некоторой степени предвидел условия ошибки, что я не всегда могу делать. Я все же хотел бы, чтобы отладчик мог вмешиваться, даже если неожиданное исключение обходит мои упреждающие assert()
s.
Чего я хочу избежать, так это необходимости заключать каждый вызов, который может вызвать исключение, в блок try/catch только для того, чтобы получить трассировку стека до ошибки. Во время выполнения я действительно не заинтересован в перехвате этих исключений. Когда они происходят, это означает, что в выполнении программы есть фатальная ошибка, и она не может нормально продолжаться. Я просто хочу получить уведомление, чтобы определить причину и устранить проблему, чтобы она больше не повторилась.
В Objective C я могу поставить символическую точку останова на objc_exception_throw
, и каждый раз, когда я что-то испорчу, я немедленно прерву выполнение и получу хорошую трассировку стека, чтобы я знал, в чем проблема. . Очень полезно.
Я понимаю, что такое поведение действительно полезно только из-за философской разницы в обработке исключений между двумя языками. Исключения Objective C предназначены только для обозначения неисправимых ошибок. Задача рутинной обработки ошибок выполняется с помощью кодов возврата ошибок. Это означает, что любое исключение Objective C является отличным кандидатом на точку останова для разработчика.
Похоже, что в C++ исключения используются по-другому. Они используются для обработки как фатальных ошибок , так и рутинных ошибок (по крайней мере, в сторонних библиотеках, которые я использую). Это означает, что я, возможно, не захочу прерывать каждое исключение, выдаваемое в C++, но я все равно нахожу эту возможность полезной, если я не могу прерывать только необработанные исключения.