Ich schreibe eine Prozedur in Python, die auf ihrer grundlegenden Ebene mit einem Motorcontroller kommuniziert. Es ist möglich, dass der Controller Flags anzeigt, die anzeigen, dass ein Fehler aufgetreten ist. Ich versuche herauszufinden, wie ich diese Fehler am besten behandeln kann.Best Practices in Python für die Behandlung externer Ausnahmen (verwende ich raise?)
Im folgenden Beispiel gibt es drei mögliche Fehler, einen Temperaturfehler, einen Stromgrenzfehler und einen Spannungsfehler. Ich habe sie anders behandelt. Gibt es einen richtigen Weg oder ist es subjektiv?
class motor_fault(Exception):
def __init__(self,error):
motor.move_at = 0 #Stop motor
self.error = error
def __str__(self):
return repr(self.value)
motor.velocity_limit = motor.slow
motor.velocity_limit_enable = True
try:
motor.move_to_absolute = motor.instrument_pos
while motor.in_position == 0:
if motor.current_limit == 1:
motor.move_at = 0 #Stop motor
print('Motor current error')
break
if motor.temp_fault == 1: raise motor_fault('Temperature Fault')
if motor.voltage_fault == 1: raise voltage_fault:
time.sleep(0.5)
else:
print('reached desired instrument position with no faults')
except motor_temp_fault as e:
#Not sure what I'd do here...
print('My exception occurred, value:', e.error)
pass
except:
motor.move_at = 0 #Stop motor just in case
print(' some other fault, probably voltage')
else:
print (' this is only printed if there were no errors')
finally:
print ('this is printed regardless of how the try exits')
Es scheint viel einfacher, das ganze try:
fallen zu lassen. Setzen Sie einfach eine Flagge in die While-Schleife und brechen Sie ab. Schauen Sie nach der Schleife auf die Flagge und sehen Sie, ob die while-Schleife erfolgreich beendet wurde.
fault = False
while motor.in_position == 0:
if motor.current_limit == 1:
fault = 'Motor current error'
break
if motor.temp_fault == 1:
fault = 'Motor temperature error'
break
if motor.voltage_fault == 1:
fault = 'Motor voltage error'
break
time.sleep(0.5)
else:
print('reached waterline with no faults')
if fault:
motor.move_at = 0 #Stop motor
print(fault)
# Now look at the fault string to determine the next course of action.
Aber das scheint irgendwie falsch oder nicht-Python zu verwenden einen Begriff, den ich nicht wirklich verstehe. Ist da wirklich etwas falsch? Danke und bitte bedenke, dass ich nicht CS-Hauptfach bin und seit 1982 keinen Programmierkurs belegt habe.
Es scheint so, als würde man MotorFault-Klassen definieren und versuchen und außer, wie Brian und S.Lotts in ihren Antworten vorschlagen, den Weg zu gehen. Um ein wenig mehr Hintergrund für jeden Interessierten geben. Die Motorklasse wurde von jemand anderem für mich geschrieben, aber ich kann es modifizieren. Die Methoden des Motors werden tatsächlich in JSON-RPC-Nachrichten übersetzt, die an den Motorcontrollertreiber gesendet werden. Dies macht das Motorobjekt zu einem sehr einfachen Nachrichtenhandler. Aus diesem Grund sollte die Motorstatusüberprüfung nicht wirklich in das Motorobjekt gehen. Ich nehme an, ich könnte es in ein anderes Objekt einpacken, aber ich mag die Idee einer check() -Funktion. – RyanN
... Der Motorcontroller-Treiber (in Java geschrieben) sendet Statusaktualisierungen über JSON-RPC zurück an mein Python-Programm, wenn sich Werte ändern. Wie Sie vielleicht vermuten, gibt es einen separaten Thread, der auf diese Nachrichten wartet und die Attribute des Motors aktualisiert. Der Code, den ich schreibe, ist ein Port von einer einfachen Version von BASIC, die auf einem Mikrocontroller lief. Der Code muss so einfach sein, dass jemand mit etwas eingeschränkten Programmierkenntnissen das Verhalten ändern kann, wenn nicht die Funktionalität. – RyanN
... Ich musste hart argumentieren, dass Python geeigneter wäre als Java, also versuche ich, den prozeduralen Teil des Codes so einfach wie möglich zu halten. – RyanN