私はPythonで手続きを書いています。それは基本レベルではモーターコントローラと通信します。コントローラーは、エラーが発生したことを示すフラグをスローすることができます。私はこれらのエラーを最良に処理する方法を理解しようとしています。外部例外を処理するためのPythonのベストプラクティス(raiseを使用しますか?)
以下の例では、温度エラー、電流制限フォルト、および電圧フォルトの3つのエラーが考えられます。私はそれらを別々に扱った。正しい方法があるのか、それとも主観的なのでしょうか?
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')
try:
全体を削除する方がはるかに簡単です。 whileループにフラグを設定してブレークするだけです。ループの後、フラグを見て、whileループが正常に終了したかどうかを確認します。
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.
しかし、どういうわけか、私は本当に理解していない用語を使用することが間違っているか、非ニシキヘビ思われます。本当にこれに間違っていますか? 私はCS専攻ではなく、1982年以来プログラミングクラスを受講していないことを覚えておいてください。
MotorFaultクラスを定義し、tryとexceptを使用しているようですが、BrianとS.Lottsがその答えに示唆しているのは方法です。 関心のある人のためにもう少し背景を与える。モータークラスは私のために他の誰かによって書かれましたが、私はそれを変更することができます。モーターのメソッドは、実際にはモーターコントローラードライバーに送信されるJSON-RPCメッセージに変換されます。これにより、モーターオブジェクトは非常に簡単なメッセージハンドラーになります。このため、モーターの状態チェックは実際にモーターオブジェクトに入るべきではありません。私は別のオブジェクトでそれをラップすることができると思いますが、私はcheck()関数の考え方が好きです。 – RyanN
...モータコントローラドライバ(Javaで書かれています)は、値が変わるたびにJSON-RPCを介してステータス更新を私のPythonプログラムに送ります。あなたが疑うかもしれないように、これらのメッセージを待ち受けて、モーターの属性を更新する別のスレッドがあります。 私が書いているコードは、マイクロコントローラで動作するBASICのシンプルなバージョンのポートです。コードは、プログラミングの知識が多少限られている人が、機能ではないにしても動作を変更できるように、十分に単純である必要があります。 – RyanN
... 私は、PythonがJavaよりも適切であると主張する必要があったので、コードの手続き部分をできるだけシンプルに保つことを試みています。 – RyanN