代码之家  ›  专栏  ›  技术社区  ›  Florent

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

  •  1
  • Florent  · 技术社区  · 6 年前

    我循环浏览一个货币列表,以便从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 但对我来说,这不是一个解决方法,因为它将继续循环,不管异常是什么,有时我需要重试下载。

    我怎样才能做到 try except 或者用 retrying 包裹?( link )

    2 回复  |  直到 6 年前
        1
  •  0
  •   Saketh Katari    6 年前
    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 布洛克,你应该去 尝试 阻止 except 阻止-保留 尝试 阻塞 function ,命名它 foo ,以便您可以从 除了
    2. 要从下一个迭代继续,您需要知道上一个迭代在哪里引发了异常-向该函数传递一个参数
        2
  •  0
  •   Florent    6 年前

    在更好地识别了问题之后,我发现我需要给出我想要捕获的异常类的全名空间:

    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