Python中模块定义的异常后如何继续循环?

时间:2018-06-29 11:15:05

标签: python python-3.x

我遍历了一系列货币,以便从API下载价格序列,并且碰巧其中的某些货币不受支持,因此它引发了模块定义的异常类:ExchangeError: This currency pair is not supported

发生这种情况时,我想继续循环到下一个货币,但是由于某种原因,我无法处理模块异常。

这是一个带有内置异常的示例:

f = [1,2,3,4,'A',5]

def foo(nb):
    return nb /2

for i in f :

    try:
        print(foo(i))

    except TypeError :
        continue

按预期返回:

0.5
1
1.5
2
2.5

但是一旦它是一个模块(或用户定义的)异常,它就会抛出一个错误,指出该异常未定义:

@retry(wait_exponential_multiplier=1000, wait_exponential_max=10000)
def apiFetchOHLC(obj, currency, timeframe, option):

    ohlcv = obj().fetch_ohlcv(currency, timeframe, since = option)
    return ohlc


for c in currencies_list :
    ...
    try :        
        # Download data
        ohlc = apiFetchOHLC(obj, c, tf, maxCandlesLimit)

    # except : # works fine
    except ExchangeError : # doesn't work
        print("Oops!  That was no valid currency.  Continue...")
        continue

这是我运行循环时遇到的错误:

except ExchangeError:    
NameError: name 'ExchangeError' is not defined

要使其正常工作,我需要删除异常类型ExchangeError,但对我来说,这不是一种解决方法,因为无论异常是什么,它都会继续循环,有时我需要重试下载。

如何使用tryexceptretrying软件包来实现? (link

2 个答案:

答案 0 :(得分:0)

def foo(count):
    try:
        while(count < 10):
            if(count%2 == 1):
                raise Exception()
            print(count)
            count = count+1
    except:
        print( str(count) + ' -> Exception')
        foo(count+1)

foo(2)

每当try块中发生异常时,请按以下方式在except块中进行处理-

  1. 要继续在try块中执行此过程,请从try块到达except块-将try块放在{{1 }},将其命名为function,以便您可以从foo块中调用它
  2. 要继续下一次迭代,您需要知道上一次引发异常的迭代-将参数传递给该函数

答案 1 :(得分:0)

更好地识别问题之后,我发现我需要提供要捕获的异常类的完整名称空间:

for c in currencies_list :
    ...
    try :        
        # Download data
        ohlc = apiFetchOHLC(obj, c, tf, maxCandlesLimit)

    except ccxt.ExchangeError : 
        print("Oops!  That was no valid currency.  Continue...")
        continue