У меня есть скрипт на python, который управляет различными тестовыми инструментами (генератор сигналов, усилитель, анализатор спектра ...) для автоматизации теста.
Эти устройства обмениваются данными через Ethernet или последовательный порт с ПК, на котором выполняется этот скрипт на python.
Я написал класс для каждого устройства, которое я использую.Сценарий начинается с инициализации экземпляра этих классов.Примерно так:
multimeter = Multimeter(192.168.1.5,5025)
amplifier = Amplifier(192.168.1.9,5025)
stirrer = Stirrer('COM4',9600)
.....
Это может ошибаться во многих отношениях (батарея разряжена, устройство не включено, кабель не подключен ...)
Возможно отловить ошибки с помощьюtry / catch - try-exc:
try:
multimeter = Multimeter(192.168.1.5,5025)
amplifier = Amplifier(192.168.1.9,5025)
stirrer = Stirrer('COM4',9600)
.....
except:
multimeter.close()
amplifier.close()
stirrer.close()
Но теперь проблема в блоке кода кроме ... Мы не уверены, что инициализация объектов прошла успешно и существуют ли они.Они могут не существовать, и поэтому мы не можем вызвать метод close ().
Поскольку создание экземпляров - это просто обычный последовательный код, я знаю, что при сбое создания экземпляра одного из моих классов все экземпляры других классов, предшествующих этой строке кода, выполняются успешно.Таким образом, вы можете попытаться создать экземпляр каждого класса и проверить, проваливается ли это или нет, и не удается ли закрыть соединения всех предыдущих объектов.
try:
multimeter = Multimeter(192.168.1.5,5025)
except:
#problem with the multimeter
print('error')
try:
amplifier = Amplifier(192.168.1.9,5025)
except:
#problem with the amplifier, but we can close the multimeter
multimeter.close()
try:
stirrer = Stirrer('COM4',9600)
except:
#problem with the stirrer, but we can close the multimeter and the
amplifier
multimeter.close()
amplifier.close()
....
Но я думаю, что это ужасный код?В частности, когда количество объектов (в данном случае тестовых инструментов растет, это становится неуправляемым. И это чувствительно к ошибкам, когда вы хотите добавить или удалить объект ... Есть ли лучший способ убедиться, что все соединения закрыты? Сокеты должнызакрыть при ошибке, чтобы мы могли назначить ip-адрес и порт сокету при следующем запуске сценария. То же самое с последовательными интерфейсами, если он не закрыт, возникнет ошибка, поскольку вы не можете подключиться кпоследовательный интерфейс, который уже открыт ...