Уведомления

Группа в Telegram: @pythonsu

#1 Фев. 9, 2022 20:53:45

Irv1n
Зарегистрирован: 2018-09-02
Сообщения: 6
Репутация: +  0  -
Профиль   Отправить e-mail  

Исключить ошибку

Есть данная функция:

     
def get_dcv(self):
        self.connector.send('DCV?')
        return float(self.connector.receive())

Функция обращается к прибору через rs232 порт и получает значения: 1.11E-3, 1.12E-3 и т.д.
Иногда с прибора прилетают битые данные и возникает ошибка: value error could not convert string to float и моя програма крашится. Как лучше всего обработать данную ошибку? Если прилетают битые данные то они отбрасываются и функция заново получает данные с прибора?

Офлайн

#2 Фев. 9, 2022 21:07:49

xam1816
Зарегистрирован: 2020-05-11
Сообщения: 1352
Репутация: +  118  -
Профиль   Отправить e-mail  

Исключить ошибку

 def get_dcv(self):
    while data := self.connector.send('DCV?'):
        try:
            return float(data)
        except ValueError:
            pass

или вот так

 def isvalid(data):
    pass # здесь описать что является приемлимым return True\False
def get_dcv(self):
    while data := self.connector.send('DCV?'):
        if isvalid(data):
            return float(data)

Отредактировано xam1816 (Фев. 9, 2022 21:20:18)

Офлайн

#3 Фев. 10, 2022 00:33:07

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9873
Репутация: +  853  -
Профиль   Отправить e-mail  

Исключить ошибку

Irv1n
Иногда с прибора прилетают битые данные и возникает ошибка: value error could not convert string to float и моя програма крашится. Как лучше всего обработать данную ошибку? Если прилетают битые данные то они отбрасываются и функция заново получает данные с прибора?
Надо оставить функцию чистой от проверок. А на ошибку проверять снаружи.

Пример
  
>>> import random
>>> 
>>> def func():
...     n = random.randint(1, 5)
...     if n > 4:
...         print('ok', n)
...     else:
...         print('fail', n)
...         raise ValueError
... 
>>> while True:
...     try:
...         func()
...     except ValueError:
...         continue
...     break
... 
fail 4
fail 4
fail 3
fail 1
fail 3
fail 1
fail 4
fail 3
fail 4
fail 1
fail 1
fail 3
fail 2
ok 5
>>>

А если ты будешь внутри функции проверять, то когда тебе попадётся исправное устройство, оно будет многократно проверяться на ошибки, которых там заведомо нет. Это будет тратить время и память впустую.



Отредактировано py.user.next (Фев. 10, 2022 00:35:54)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version