python - 避免 Python 中的多个 Try/Except block

标签 python exception

我有一个工作代码,但发现有大量的 try/except block 来处理异常效率非常低。有一个更好的方法吗?

我当前使用的代码粘贴在下面。我应该执行自定义函数还是 for 循环?如何创建一个?

由于要求,代码已被缩短...

rows = []
rows.append(['Name','Weight', 'Height', 'Season', 'Age', 'Tm', 'Lg', 'Pos', 'G', 'GS', 'MP', 'FG', 'FGA' , 'FGP' , 'P3' , 'PA3' , 'PP3' , 'P2' , 'PA2', 'PP2', 'eFGP' , 'FT', 'FTA' , 'FTP', 'ORB', 'DRB' , 'TRB', 'AST' , 'STL', 'BLK', 'TOV', 'PF' , 'PTS'])

for result in results[1:len(results)]:
    Name = soup.find(name="h1", attrs={"itemprop":"name"}).text.strip()
    Weight = soup.find(name="span", attrs={"itemprop":"weight"}).text.strip()
    Height = soup.find(name="span", attrs={"itemprop":"height"}).text.strip()
    # find all columns per result

    # data = result.find_all('td')
    try:
        season = result.find_all('a')[0]
        season = season.getText()
    except:
        season = 'NA'
    # check that columns have data 
        # if len(data) == 0: 
            # continue
    Season = season
    Age_find = result.find_all('td', attrs={'data-stat': 'age'})
    Tm_find = result.find_all('td', attrs={'data-stat': 'team_id'})
    Lg_find = result.find_all('td', attrs={'data-stat': 'lg_id'})
    Pos_find = result.find_all('td', attrs={'data-stat': 'pos'})
    G_find = result.find_all('td', attrs={'data-stat': 'g'})
    GS_find = result.find_all('td', attrs={'data-stat': 'gs'})
    MP_find = result.find_all('td', attrs={'data-stat': 'mp_per_g'})
    FG_find = result.find_all('td', attrs={'data-stat': 'fg_per_g'})
    FGA_find = result.find_all('td', attrs={'data-stat': 'fga_per_g'})
    FGP_find = result.find_all('td', attrs={'data-stat': 'fg_pct'})
    P3_find = result.find_all('td', attrs={'data-stat': 'fg3_per_g'})
    PA3_find = result.find_all('td', attrs={'data-stat': 'fg3a_per_g'})
    PP3_find = result.find_all('td', attrs={'data-stat': 'fg3_pct'})
    P2_find = result.find_all('td', attrs={'data-stat': 'fg2_per_g'})
    PA2_find = result.find_all('td', attrs={'data-stat': 'fg2a_per_g'})
    PP2_find = result.find_all('td', attrs={'data-stat': 'fg2_pct'})
    eFGP_find = result.find_all('td', attrs={'data-stat': 'efg_pct'})
    FT_find = result.find_all('td', attrs={'data-stat': 'ft_per_g'})
    FTA_find = result.find_all('td', attrs={'data-stat': 'fta_per_g'})
    FTP_find = result.find_all('td', attrs={'data-stat': 'ft_pct'})
    ORB_find = result.find_all('td', attrs={'data-stat': 'orb_per_g'})
    DRB_find = result.find_all('td', attrs={'data-stat': 'drb_per_g'})
    TRB_find = result.find_all('td', attrs={'data-stat': 'trb_per_g'})
    AST_find = result.find_all('td', attrs={'data-stat': 'ast_per_g'})
    STL_find = result.find_all('td', attrs={'data-stat': 'stl_per_g'})
    BLK_find = result.find_all('td', attrs={'data-stat': 'blk_per_g'})
    TOV_find = result.find_all('td', attrs={'data-stat': 'tov_per_g'})
    PF_find = result.find_all('td', attrs={'data-stat': 'pf_per_g'})
    PTS_find = result.find_all('td', attrs={'data-stat': 'pts_per_g'})

    try:
        Age = Age_find[0].getText()
    except:
        Age = 'NA'

    try:
        Tm = Tm_find[0].getText()
    except:    
        Tm = 'NA'

    try:
        Lg = Lg_find[0].getText()
    except:    
        Lg = 'NA'

    try:
        Pos = Pos_find[0].getText()
    except:    
        Pos = 'NA'

    try:
        G = G_find[0].getText()
    except:
        G = 'NA'

    try:
        GS = GS_find[0].getText()
    except:    
        GS = 'NA'

    try:
        MP = MP_find[0].getText()
    except:    
        MP = 'NA'

    try:
        FG = FG_find[0].getText()
    except:    
        FG = 'NA'

    try:
        FGA = FGA_find[0].getText()
    except:    
        FGA = 'NA'

    try:
        FGP = FGP_find[0].getText()
    except:    
        FGP = 'NA'

    try:    
        P3 = P3_find[0].getText()
    except:    
        P3 = 'NA'

    try:
        PA3 = PA3_find[0].getText()
    except:    
        PA3 = 'NA'

    try:
        PP3 = PP3_find[0].getText()
    except:    
        PP3 = 'NA'

    try:
        P2 = P2_find[0].getText()
    except:    
        P2 = 'NA'

    try:
        PA2 = PA2_find[0].getText()
    except:    
        PA2 = 'NA'

    try:
        PP2 = PP2_find[0].getText()
    except:    
        PP2 = 'NA'

    try:    
        eFGP = eFGP_find[0].getText()
    except:    
        eFGP = 'NA'

    try:    
        FT = FT_find[0].getText()
    except:    
        FT = 'NA'

    try:
        FTA = FTA_find[0].getText()
    except:    
        FTA = 'NA'

    try:
        FTP = FTP_find[0].getText()
    except:    
        FTP = 'NA'

    try:
        ORB = ORB_find[0].getText()
    except:    
        ORB = 'NA'

    try:    
        DRB = DRB_find[0].getText()
    except:    
        DRB = 'NA'

    try:
        TRB = RRB_find[0].getText()
    except:    
        TRB = 'NA'

    try:
        AST = AST_find[0].getText()
    except:    
        AST = 'NA'


    rows.append([Name, Weight, Height, Season, 
                 Age, Tm, Lg, Pos, G, GS, MP, FG, FGA, 
                 FGP, P3, PA3, PP3, P2, PA2, PP2, eFGP, FT,
                 FTA , FTP, ORB, DRB, TRB, AST, STL, BLK, TOV, PF, PTS])

with open('player_zaid.csv','w', newline='') as f_output:
    csv_output = csv.writer(f_output)
    csv_output.writerows(rows)

最佳答案

您有许多代码段基本上执行相同的操作,这违反了 Don't Repeat Yourself (DRY)原则。避免重复的常用方法是编写一个函数来隐藏重复。

def get_text_or_NA(container):
    try:
        result = container[0].getText()
    except:
        result = 'NA'
    return result

那么你的基本代码是

Age = get_text_or_NA(Age_find)
Tm = get_text_or_NA(Tm_find)
Lg = get_text_or_NA(Lg_find)

等等。

您可以使用类似的方法来删除代码中的其他重复项 - 我将把这些留给您。正如 @roganjosh 的评论所述,您确实不应该在不给出异常的情况下使用 except: 。你的方式掩盖了所有问题。更加具体并仅隐藏您期望的异常,以便可以在更高级别捕获意外的异常。

关于python - 避免 Python 中的多个 Try/Except block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54959693/

相关文章:

c++ - 根据当前标准,关闭 C++ 中的异常会导致未定义的行为吗?

c++ - 在什么情况下EXCEPTION_RECORD链接到另一个嵌套异常?

exception - log4j2 异常处理不起作用

python - jwt.encode 失败,显示 "Object of type ' 字节“不可 JSON 序列化”

python - 带有回滚仿真的 Django TransactionTestCase

Python - 查找列表中的值位置并输出为新列表

java.lang.IllegalArgumentException : im == null! 错误

python - PyOpenGL ubuntu 14.04 : undefined function error

python - 在应用程序中包含 openssl

java - 抛出 InstantiationException