Nano Hash - криптовалюты, майнинг, программирование

Разница между вызовом исключения и автоматическим вызовом исключения

В настоящее время я использую фреймворк wxPython, и мой код выглядит так:

Привязка события:

self.frequency_grid.Bind(wx.grid.EVT_GRID_CELL_CHANGE, self.on_cell_changed)

Функция, которая обрабатывает измененные ячейки:

def on_cell_changed(self, event):
    self.current_grid = event.GetEventObject()
    try:
        new_value= self.get_cell_value()
        if new_value < 0:
            raise AttributeError
        #allow the cell to update
    except AttributeError:
        event.Veto()
        wx.MessageBox(_("Positive values only."), "", wx.OK|wx.ICON_WARNING)
    except:
        wx.MessageBox(_("Invalid value for cell."), "", wx.OK|wx.ICON_WARNING)
        event.Veto()

Функция get_cell_value() считывает значение из текущей ячейки и преобразует его в целое число, просто используя функцию int(). Если пользователь вводит в ячейку такой символ, как «а», очевидно, что эта функция не работает, и возникает исключение. В этом случае появляется окно сообщения, сообщающее пользователю, что ячейка имеет недопустимое значение. Это то, что я называю автоматически вызванным исключением, и выполняется последний блок исключения.

В случае отрицательных значений я вручную вызываю AttributeError (просто хотел увидеть что-то отличное от ValueError, что происходит, когда пользователь вводит символы). Однако в этом случае wxPython дважды отправляет событие EVT_GRID_CELL_CHANGE, поэтому в исключениях, вызванных вручную, должно быть что-то другое.

Я отдельно поднял тикет о повторяющихся событиях по адресу http://trac.wxwidgets.org/ticket/16333 но просто пытаюсь понять, почему первый сценарий не заставляет wxPython отправлять 2 события по сравнению со вторым сценарием.

18.06.2014

Ответы:


1

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

Чтобы ваш код выглядел лучше, я бы предложил привести значение к типу int с блоком try...except, а затем проверить наличие отрицательных значений.

try:
    value = int(text)
except:
    return MessageBox('Enter digit')
if value < 0:
    return MessageBox('Enter positive digit')
18.06.2014
  • это то, что делает инструкция try, для моего исходного вопроса не имеет значения, вызываю ли я другую функцию из блока try с int (текстом) внутри этой функции или напрямую выполняю int() в том же блоке try. 18.06.2014

  • 2

    В Исключениях нет разницы, но вы обрабатываете их по-другому, в другом месте кода.

    Я подозреваю, что вызов veto() вызывает дополнительное событие. Но почему бы не проверить ввод только в одном месте? то есть ваша функция get_cell_value() должна убедиться, что это целое число> 0.

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

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

    20.06.2014
  • вето не вызывает дополнительное событие. Если я не использую messagebox, событие как-то не дублируется. Как я могу обрабатывать исключения по-другому? Если в Исключениях нет разницы, то я поднимаю Исключение, и код, автоматически запускающий Исключение из недопустимого преобразования int(), должен привести к тому, что оба исключения обрабатываются одинаково. Вы можете быть правы насчет дизайна пользовательского интерфейса или валидации в 1 месте, но мой первоначальный вопрос состоит в том, чтобы спросить, почему эта конкретная ситуация вообще возникает. 23.06.2014

  • 3

    После небольшого отслеживания я обнаружил, что создание MessageBox приводит к возникновению события EVT_GRID_CELL_CHANGING, которое затем приводит к возникновению события EVT_GRID_CELL_CHANGED, поэтому я видел повторяющиеся события. Причина, по которой я не видел повторяющихся событий во время ввода символа, заключалась в том, что в обработчике событий для EVT_GRID_CELL_CHANGING вызывалось Veto(), если преобразование int() было недопустимым, потому что мой обработчик для этого события получает ввод сетки и пытается преобразовать его.

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

    24.06.2014
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

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

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..