尝试执行异常处理时出错

时间:2015-06-26 14:29:28

标签: python pandas exception-handling

我正在尝试通过以下代码处理HTTP IncompleteRead错误。但是,我发现只要我调用message查看异常处理是否有效,我就会在行'NoneType' object has no attribute '__getitem__'中收到错误df = update(currency)[1],尽管在update时尝试处理这种情况返回NoneType

import csv
from io import BytesIO
import pandas as pd
import os
from zipfile import ZipFile
from pprint import pprint, pformat
import http.client
import urllib.request
import urllib.parse

def update(ABBRV):
    if ABBRV == 'LAB':
        try:

                my_url = 'http://www.bankofcanada.ca/stats/results/csv'
                data = urllib.parse.urlencode({"lookupPage": "lookup_yield_curve.php",
                                     "startRange": "1986-01-01",
                                     "searchRange": "all"})

                binary_data = data.encode('utf-8')
                req = urllib.request.Request(my_url, binary_data)
                result = urllib.request.urlopen(req)
                zipdata = result.read()

                #In case of http.client.IncompleteRead Error
        except http.client.IncompleteRead as e:
            df = update(ABBRV)[1]
            return df

            zipfile = ZipFile(BytesIO(zipdata))  
            df = pd.read_csv(zipfile.open(zipfile.namelist()[0]))                    
            df = pd.melt(df, id_vars=['Date'])

            def getYear(s):
                x = re.search('(\d+)',s)
                return (float(x.groups()[0]))/100 if x is not None else 'empty string'

            if df is None:
                dict = {}
                symbols = ['Date','Mat', 'VAL', 'ABBRV']
                for l in symbols:
                    dict0[l] = 0
                    df = pd.Series(dict0, name='Data')

            return [df, result]

    if ABBRV != 'LAB':
        raise ValueError

def message(ABBRV):
    df = update(ABBRV)[1]
    if isinstance(df, pd.DataFrame) != 1:
        return 300
    else:
        return 200

调用该函数:

sg = message('LAB')
print sg

谢谢

编辑:这部分代码是否无法阻止返回None类型?此外,编辑上述代码的缩进问题反映了Anand S Kumar的建议。

if df is None:
    dict = {}
    symbols = ['Date','Mat', 'VAL', 'ABBRV']
    for l in symbols:
        dict0[l] = 0
        df = pd.Series(dict0, name='Data')

1 个答案:

答案 0 :(得分:1)

我在代码中看到了一些问题 -

  1. 在try函数内部,如果没有错误发生,你没有返回任何内容,如果你没有从函数返回任何东西,那么就像函数返回None,因此假设有url获取方没有错误,您最终会返回None,然后尝试拨打[1] NoneType,导致您的问题出现问题。

  2. 如果发生了IncompleteRead Exception,您再次调用update(currency)是什么让您认为如果第一次读取不成功,第二次成功?对我来说,如果存在IncompleteRead异常,该函数将进入无限递归,并在某个时间后以{0}}结束时出现以下错误。

  3. 条件RuntimeError: maximum recursion depth exceeded在条件 - if ABBRV != 'LAB': raise ValueError内,我说的第一个条件(不等于)永远不会是真的,我想你想把这个条件放在if块之外(最好放一个if ABBRV == 'LAB':,而不是再次检查另一个条件。)

  4. 建议不要将函数调用为 - else,也可以将它们分成两行,首先得到df = update(ABBRV)[1]的结果,然后检查它是否为update(ABBRV) },如果它不是None,则在其上调用None并执行其余逻辑。