2016-07-17 2 views
0

Я пытаюсь реорганизовать python class в Genie, но я зациклился на том, как обрабатывать ошибки. Некоторые указатели будут очень благодарны.Обработка ошибок с Genie

Если я правильно понял, способ обработки ошибок с Genie используется Try ... кроме блоков, но как перевести следующий тип обработки в этой парадигме ошибки:

# 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 

Это фиктивный код, я только моделирование проблемы, и я отдаю себе отчет в том, что он не будет компилироваться как есть. Я ищу только указатель на то, как передать команду «'raise' '' из python.

ответ

2

Вам нужно определить тип ошибки как exception, а затем определить, что ваша getitem функция raises такая ошибка:

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() ненужно. Компилятор Vala проверяет во время компиляции, что все вызовы функции getitem передают целое число в качестве аргумента.

Альтернативный подход заключается в использовании 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() будут записаны некоторые детали индекса вне границ, если вам понадобится его для последующей отладки.

+0

Is OUT_OF_BOUNDS определение типа, которое я могу придумать, или список вариантов, которые я могу использовать? –

+0

В примере используется один, который я составил, вы можете изменить его на все, что захотите. Существуют существующие определения библиотек для исключений, если вы хотите их использовать, например GLib.IOError – AlThomas

Смежные вопросы