Политика с ловлей станд.:: bad_alloc

Да, вот ответ, учитывая массив NumPy, array, и значение, item, для поиска:

itemindex = numpy.where(array==item)

результатом является кортеж с первым все индексы строки, затем все индексы столбца.

, Например, если бы массив является двумя размерами и он содержал Ваш объект в двух местах затем

array[itemindex[0][0]][itemindex[1][0]]

, было бы равно Вашему объекту, и так будет

array[itemindex[0][1]][itemindex[1][1]]

numpy.where

12
задан Evan Teran 20 August 2009 в 18:38
поделиться

4 ответа

Проблема заключается не в том, «где перехватить», а в том, «что делать, когда обнаружено исключение».

Если вы хотите проверить, вместо того, чтобы заключать в оболочку с помощью , попробуйте catch вам лучше использовать

    #include <new>
    x = new (std::nothrow) X();
    if (x == NULL) {
        // allocation failed
    }

Моя обычная практика -

  • в неинтерактивной программе перехватить на основном уровне и отобразить там соответствующее сообщение об ошибке.

  • в программе, имеющей цикл взаимодействия с пользователем, также перехватить в цикле, чтобы пользователь мог закрыть некоторые вещи и попытаться продолжить.

В исключительных случаях есть другие места, где уловка имеет смысл, но редко.

17
ответ дан 2 December 2019 в 03:48
поделиться

Обработать исключение, когда вы можете . Если выделение не удается, и ваше приложение не может продолжать работу без этого бита памяти, зачем вообще проверять наличие ошибки?

Обработка ошибки, когда она может быть обработана , когда есть значимый способ исправления. Если с ошибкой ничего не поделать, просто позвольте ей распространиться.

11
ответ дан 2 December 2019 в 03:48
поделиться

Я обычно перехватываю исключения в момент, когда пользователь инициировал действие. Для консольных приложений это означает в main , для приложений с графическим интерфейсом я помещаю обработчики в такие места, как обработчики нажатия кнопок и т. Д.

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

6
ответ дан 2 December 2019 в 03:48
поделиться

Обработать его в main () (или эквивалентном обработчике исключений верхнего уровня в Qt)

Причина в том, что std :: bad_alloc либо происходит, когда вы исчерпываете пространство памяти (2 или 3 ГБ в 32-битных системах, не бывает в 64-битных системах) или когда вы исчерпываете пространство подкачки. Современные распределители кучи не настроены для работы из пространства подкачки, так что это будет медленная, шумная смерть - скорее всего, ваши пользователи заранее убьют ваше приложение, поскольку его пользовательский интерфейс больше не отвечает. А в Linux обработка памяти ОС по умолчанию настолько плохая, что ваше приложение, вероятно, будет автоматически убито.

Итак, вы мало что можете сделать. Признайтесь, что у вас есть ошибка, и посмотрите, сможете ли вы сохранить какую-либо работу, которую мог сделать пользователь. Чтобы иметь возможность сделать это, лучше прервать как можно больше. Да, это может фактически потерять часть последнего ввода пользователя.

0
ответ дан 2 December 2019 в 03:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: