0

Python クラスを Genieにリファクタリングしようとしていますが、エラーの処理方法に行き詰まっています。いくつかの指針をいただければ幸いです。

私が正しく理解していれば、Genie でエラーを処理する方法は Try...except ブロックを使用していますが、次のタイプのエラー処理をこのパラダイムに変換する方法は次のとおりです。

# Enable dictionary/list-style access to options and arguments.
def __getitem__(self, key):
    if isinstance(key, int):
        if key < len(self.arguments):
            return self.arguments[key]
        else:
            raise ArgParserError(
                "positional argument index [%s] is out of bounds" % key
            )
    else:
        option = self._get_opt(key)
        return option.value

私が今いるコードは(Genieで)次のようになります。

def getitem (key:int):string
    if key.is_int()
        if key < len(_arguments)
            return _arguments[key]
        else
            raise ArgParserError(
                "positional argument index [%s] is out of bounds", key
            )
    else
        var option = _get_opt(key)
        return option.value

これはダミー コードです。私は問題をモデル化しているだけであり、そのままではコンパイルできないことを認識しています。Python から '''raise''' コマンドを変換する方法についてのポインタを探しているだけです。

4

1 に答える 1

2

エラータイプを として定義し、関数がそのようなエラーexceptionであることを特定する必要があります。getitemraises

exception ArgParserError
    OUT_OF_BOUNDS

def getitem( key:int ):string raises ArgParserError
    if key < len(_arguments)
        return _arguments[key]
    else
        raise new ArgParserError.OUT_OF_BOUNDS(
            "positional argument index [%s] is out of bounds", key
             )

Genie は静的に型付けされるため、if key.is_int()は不要です。getitemVala コンパイラは、関数へのすべての呼び出しが引数として整数を渡すことをコンパイル時にチェックします。

別の方法outとして、結果値にパラメーターを使用し、関数の戻り値を使用して結果が有効かどうかを通知する方法があります。

def getitem( key:uint, out value:string ):bool
    result:bool = false
    value = ""
    if key < _arguments.length
        value = _arguments[ key ]
        result = true
    else
        info( "positional argument index [%s] is out of bounds", key )
    return result

キーを符号なし整数にuintすることで、負のインデックスを渡すことができなくなります。への呼び出しinfo()は、後でデバッグするために必要な場合に備えて、範囲外のインデックスの詳細をログに記録します。

于 2016-07-17T11:23:38.440 に答える