Ошибка перехвата, когда индекс QList выходит за пределы

Я разрабатываю приложение для Blackberry 10, и когда я пытаюсь получить элемент 2 из QStringList, в то время как этот список содержит только 1 элемент, происходит сбой моего приложения.

Я использую следующий код, чтобы поймать этот тип ошибки:

try {
//a code that accesses QStringList with an index out of bounds
}
catch (Exception e) {

}

Но исключение не перехватывается и приложение всегда вылетает.

Я пытался поймать (стандартное исключение: исключение& д) и поймать (…) и тоже не сработало.

Как я могу использовать try catch, чтобы поймать эту ошибку?

-1

Решение

Доступ к QList вне его диапазона не исключение. Вместо этого это предполагает что вы уже проверили, что индекс находится в диапазоне (что происходит, если это не так, объясняется ниже).

На самом деле, это не плохой дизайн, а хороший дизайн класса контейнера: иногда (в большинстве случаев) вы уже знаете, что индексы находятся в диапазоне. Если Qt должен реагировать на внешний доступ, выдавая исключения, это означает, что вы хотите положиться на эту проверку, что означает эту проверку имеет должно быть сделано (даже если вам не нужна Qt для проверки). Вместо этого Qt предполагает, что вы предоставляете правильный индекс. В отладочных сборках это проверяется с утверждение и если утверждение не выполнено, ваша программа завершается с причиной (вы можете отследить его для отладки), но в режиме релиза это проверка не делается вообще, поэтому он молча производит неопределенное поведение, если индекс вышел за пределы еще доступ к необработанной памяти в структуре данных. Это максимально быстро, но требует, чтобы индекс был действительным.

Утверждения прервут ваш процесс, если они не будут выполнены, а это означает, что вы не можете «поймать» такого рода ошибки. Избегайте этого в первую очередь, то есть тест для вашего индекса в диапазоне до доступ к списку.

Обратите внимание, что некоторые (может быть, все?) Классы контейнеров также предоставляют доступ с «реальной» проверкой индекса (без сбоев, также в сборке релиза), то есть с определенным и предполагаемым поведением, когда оно выходит за пределы. За QListэта функция:

T value(int index, T fallbackValue)

Он пытается получить доступ к элементу в index с проверкой границ. Если ваш индекс не находится в диапазоне (или в ассоциативных контейнерах: он не был найден), fallbackValue Вы дали будет возвращен. Второй параметр по умолчанию построен по умолчанию T, Обратите внимание, что это значение должно быть построено, даже если ваш индекс правильный. Вот почему даже в тех случаях, когда вам нужна проверка, может быть лучше выполнить проверку вручную с помощью ветви и создать значение по умолчанию только в случае необходимости (в частности, если вам нужно оценить дорогостоящее выражение для создания вашего запасного значения):

if (index < myList.count())   // We only check upper bound in this scenario
foo = myList[index];
else
foo = expensiveFunctionReturningMyFallbackValue();
4

Другие решения

Я не программирую на Blackberry, но если исключение не было поймано, наиболее вероятная причина в том, что тип исключения, которое вы выбрасываете, не является исключением. В крайнем случае вы можете попытаться поймать всех.

try {
//a code that throws Null Pointer Exception
}
catch (...) {
}

И вы должны использовать константную ссылку, чтобы избежать нежелательных побочных эффектов.

-1

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector