Pepperアプリ開発 エラー処理

PythonBoxでエラーが発生した際、
ハンドリングしていないエラーの場合はアプリケーションが即座に終了します。

現状では、ロボットが強制終了した場合、
ユーザからはなんの前触れもなく突然終了したように見えてしまうので、
必ずハンドリングしてユーザに伝えるようにしましょう。

Choregrapheで検知できたエラーの場合は、
エラーが発生したボックスが赤くなります。
これはSyntaxErrorなどの場合でも同様です。

ss1

PythonBoxでエラーをハンドリングするためにはいくつかの方法がありますので、
それらの方法について解説していきます。

一般的なPythonでのエラー処理のように

try: except: で記述することでエラーをハンドリングできます。


class MyClass(GeneratedClass):
    def __init__(self):
        GeneratedClass.__init__(self)

    def onLoad(self):
        pass

    def onUnload(self):
        pass

    def onInput_onStart(self):
        try:
            raise Exception, "Raise Error."
        except Exception as e:
            self.log(str(e))

    def onInput_onStop(self):
        self.onUnload()
        self.onStopped()

上記の例では単純にログを吐いているだけなので、
なんのカバーもできてません。

実際に使うケースだと下記のように使うことが多くなると思います。


class MyClass(GeneratedClass):
    def __init__(self):
        GeneratedClass.__init__(self)

    def onLoad(self):
        pass

    def onUnload(self):
        pass

    def onInput_onStart(self):
        try:
            # エラーが発生しうる処理
            self.onSucceeded()
        except Exception:
            self.onFailed()

    def onInput_onStop(self):
        self.onUnload()
        self.onStopped()

上のようにraiseされた場合の出力を変えてやることで
エラーのハンドリングを行えます。

しかし、このようにしなくても
PythonBoxには標準でエラーを処理するための機能があります。

Boxを編集画面でonError出力を追加

ss2 ss3

class MyClass(GeneratedClass):
    def __init__(self):
        GeneratedClass.__init__(self)

    def onLoad(self):
        pass

    def onUnload(self):
        pass

    def onInput_onStart(self):
        raise Exception, "Raise Error."

    def onInput_onStop(self):
        self.onUnload()
        self.onStopped()

このように、onErrorという名前の出力をPythonBoxに設定してやると、
try: except:をしなくても、内部でExceotionがraiseされた場合に
アプリケーションを落とすことなくonErrorで出力することができます。

また、onErrorのTypeを文字列にすることで、
raiseしたExceptionのエラーメッセージを文字列で出力することができます。

コメントを残す

メールアドレスが公開されることはありません。