Вернуть часть результата, если произойдет, кроме

Я использую Python. У меня есть функция (getAll), которая вызывает другую функцию в цикле (getPart), и на каждом этапе возвращаемое значение обновляется. В некоторых случаях, когда я вызываю функцию, которая находится внутри цикла, это не удается. Мне нужно вернуть результат в данный момент.

def getAll(m, d, v, t, s, tn, type):
  result = []
  flag = 0
  while flag == 0:
    tempResult = getPart(m, d, v)
    for i in range(0, len(tempResult)):
      result.append(tempResult[i])
    flag = tempResult[0]
  return result

print getAll(5,4,1,'ds',8,'data')

Мне нужно вывести результирующее частичное значение, если произойдет, за исключением некоторого шага, когда я вызываю tempResult в getAll

4 ответа

Решение

Похоже, вам нужно использовать попробовать, кроме блоков

def getAll(m, d, v, t, s, tn, type):
    result = []
    flag = 0
    while flag == 0:
        try: #start of the try block. 
            tempResult = getPart(m, d, v)
            for i in range(0, len(tempResult)):
                result.append(tempResult[i])
            flag = tempResult[0]
        except: #handle what ever errors comes here
            return tempResult
    return tempResult

В основном, когда вы ловите ошибку или возникает ошибка, она будет запускать все, что находится в блоке исключений, так как мы помещаем return tempResult он вернет значение.

Как говорится в комментарии, перехват всех исключений является плохой идеей, поскольку вы можете столкнуться с ошибкой, которая не имеет никакого отношения к вашему коду, и он поймает ее, для конкретных исключений, которые вы должны сделать:

try:
    #do something
except <Error name like "ValueError">
    #handle it

Вы также можете увидеть более подробную информацию об ошибке, как:

try:
    #do something
except ValueError as e:
    #handle it
    print(e) #prints the error

Так что выясните, какие ошибки приведут к остановке вашей программы, и поместите ее туда.

Вы можете обработать исключение, заключив код, который вызывает ошибку, в try/except и распечатать результат в except блок:

def getAll(m, d, v, t, s, tn, type):
    result = []
    flag = 0
    while flag == 0:
        try:
            tempResult = getPart(m, d, v)
        except SomeError: # specify error type
            print('The partial result is', result)
            raise  # re-raise error
        for i in range(0, len(tempResult)):
            result.append(tempResult[i])
        flag = tempResult[0]
    return result

print getAll(5,4,1,'ds',8,'data')

На другой ноте, так как вы уже знаете, звоните getPart может вызвать ошибку, вы можете переместить try/except блок в функцию. Это зависит, конечно, от того, что именно вы пытаетесь достичь.

Оберните ваш метод в попытке, кроме блока. Возможно, вы захотите вызвать исключение, чтобы вы тоже могли на него ответить.

def getAll(m, d, v, t, s, tn, type):
    result = []
    flag = 0
    try:
        while flag == 0:
            tempResult = getPart(m, d, v)
            for i in range(0, len(tempResult)):
              result.append(tempResult[i])
            flag = tempResult[0]
        return result
    except Exception as e:
        print e
        return result

Это не обязательно лучшее решение, поскольку в зависимости от ошибки может быть лучше предотвратить ее, чем обрабатывать таким образом. Тем не менее, вы можете попробовать (без каламбура изначально...) следующее (где WhateverError это ошибка, которая возникает в вашем случае):

def getAll(m, d, v, t, s, tn, type):
  result = []
  flag = 0
  while flag == 0:
    try:
      tempResult = getPart(m, d, v)
    except WhateverError:
      return result
    for i in range(0, len(tempResult)):
      result.append(tempResult[i])
    flag = tempResult[0]
  return result

print getAll(5,4,1,'ds',8,'data')
Другие вопросы по тегам