简体   繁体   English

避免在Python中使用多个Try / Except块

[英]Avoiding Multiple Try/Except blocks in Python

I have a working code but find that having numerous try/except blocks to handle exceptions very inefficient. 我有一个有效的代码,但是发现拥有大量try / except块来处理异常非常低效。 Is there a better way to do this? 有一个更好的方法吗?

The code that I am currently using is pasted below. 我当前使用的代码粘贴在下面。 Should I do a custom function or for loops? 我应该执行自定义函数还是for循环? How do I create one? 如何创建一个?

Code has been cut short due to requirements... 由于要求,代码已被缩短...

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)

You have many sections of code that do basically the same thing, which violates the Don't Repeat Yourself (DRY) principle. 您有许多代码段基本上执行相同的操作,这违反了“ 不要重复自己做(DRY)”原则。 The usual way to avoid that repetition is to write a function to hide the repetition. 避免重复的通常方法是编写一个隐藏重复的函数。

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

Then your basic code is 然后你的基本代码是

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

and so on. 等等。

You could similar means to remove other repetitions in your code--I'll leave those to you. 您可以采取类似的方法来删除代码中的其他重复-我会留给您。 And as the comment from @roganjosh states, you really should not use except: without giving an exception. 正如@roganjosh的评论所指出的,您真的不应该使用except:不给出异常。 Your way just hides all problem. 您的方式隐藏了所有问题。 Be more specific and hide only the exceptions you expect, so unexpected ones can be caught at a higher level. 更具体些,只隐藏您期望的异常,这样可以在更高层次上捕获意外的异常。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM