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