Есть ли правильный путь
Да.
или это субъективно?
Количество
Используйте оператор raise
.
Во-первых, пожалуйста, используйте CapitalLetters для ваших уникальных исключений
class Motor_Fault( Exception ): pass
class Temperature_Fault( Motor_Fault ): pass
class Voltage_Fault( Motor_Fault ): pass
class Current_Fault( Motor_Fault ): pass
Во-вторых, отделите обнаружение ошибок от остальной части вашей обработки.
В-третьих, не делайте ничего в классе исключений. Обработайте остановку двигателя в вашем приложении.
В-четвертых, проверка состояния двигателя не относится к контуру двигателя вашего приложения. Это все часть функции метода, которая реализует motor.move_to_absolute
.
if motor.current_limit == 1: raise Current_Fault()
if motor.temp_fault == 1: raise Temperature_Fault()
if motor.voltage_fault == 1: raise Voltage_Fault()
В-пятых, ваш цикл приложения должен выглядеть следующим образом.
motor.velocity_limit = motor.slow
motor.velocity_limit_enable = True
try:
motor.move_to_absolute = motor.instrument_pos
while motor.in_position == 0:
time.sleep(0.5)
print('reached desired instrument position with no faults')
except Motor_Fault, e:
motor.move_at = 0 #Stop motor
print(fault)
Двигатель должен вызывать свои собственные исключения. Если по какой-то причине это невозможно, то вы можете «обернуть» двигатель с помощью некоторой проверки состояния. Это не идеально, так как двигатель должен вызывать свои собственные исключения.
def check():
if motor.current_limit == 1: raise Current_Fault()
if motor.temp_fault == 1: raise Temperature_Fault()
if motor.voltage_fault == 1: raise Voltage_Fault()
Вызовите эту функцию непосредственно перед sleep
.