Да, вот ответ, учитывая массив NumPy, array
, и значение, item
, для поиска:
itemindex = numpy.where(array==item)
результатом является кортеж с первым все индексы строки, затем все индексы столбца.
, Например, если бы массив является двумя размерами и он содержал Ваш объект в двух местах затем
array[itemindex[0][0]][itemindex[1][0]]
, было бы равно Вашему объекту, и так будет
array[itemindex[0][1]][itemindex[1][1]]
Проблема заключается не в том, «где перехватить», а в том, «что делать, когда обнаружено исключение».
Если вы хотите проверить, вместо того, чтобы заключать в оболочку с помощью , попробуйте catch
вам лучше использовать
#include <new>
x = new (std::nothrow) X();
if (x == NULL) {
// allocation failed
}
Моя обычная практика -
в неинтерактивной программе перехватить на основном уровне и отобразить там соответствующее сообщение об ошибке.
в программе, имеющей цикл взаимодействия с пользователем, также перехватить в цикле, чтобы пользователь мог закрыть некоторые вещи и попытаться продолжить.
В исключительных случаях есть другие места, где уловка имеет смысл, но редко.
Обработать исключение, когда вы можете . Если выделение не удается, и ваше приложение не может продолжать работу без этого бита памяти, зачем вообще проверять наличие ошибки?
Обработка ошибки, когда она может быть обработана , когда есть значимый способ исправления. Если с ошибкой ничего не поделать, просто позвольте ей распространиться.
Я обычно перехватываю исключения в момент, когда пользователь инициировал действие. Для консольных приложений это означает в main
, для приложений с графическим интерфейсом я помещаю обработчики в такие места, как обработчики нажатия кнопок и т. Д.
Я считаю, что нет смысла ловить исключения в середине действия, пользователь обычно ожидает, что операция либо завершится успешно, либо полностью завершится неудачей.
Обработать его в main ()
(или эквивалентном обработчике исключений верхнего уровня в Qt)
Причина в том, что std :: bad_alloc либо происходит, когда вы исчерпываете пространство памяти (2 или 3 ГБ в 32-битных системах, не бывает в 64-битных системах) или когда вы исчерпываете пространство подкачки. Современные распределители кучи не настроены для работы из пространства подкачки, так что это будет медленная, шумная смерть - скорее всего, ваши пользователи заранее убьют ваше приложение, поскольку его пользовательский интерфейс больше не отвечает. А в Linux обработка памяти ОС по умолчанию настолько плохая, что ваше приложение, вероятно, будет автоматически убито.
Итак, вы мало что можете сделать. Признайтесь, что у вас есть ошибка, и посмотрите, сможете ли вы сохранить какую-либо работу, которую мог сделать пользователь. Чтобы иметь возможность сделать это, лучше прервать как можно больше. Да, это может фактически потерять часть последнего ввода пользователя.