忽略KeyError并继续程序

2024-03-29 01:55:04 发布

您现在位置:Python中文网/ 问答频道 /正文

在Python 3中,我有一个代码如下的程序。它基本上是从用户那里获取一个输入,并将其与字典(交换数据)进行核对,然后输出一个信息列表。

from shares import EXCHANGE_DATA
portfolio_str=input("Please list portfolio: ")
portfolio_str= portfolio_str.replace(' ','')
portfolio_str= portfolio_str.upper()
portfolio_list= portfolio_str.split(',')
print()
print('{:<6} {:<20} {:>8}'.format('Code', 'Name', 'Price'))
EXCHANGE_DATA = {code:(share_name,share_value) for code, share_name, share_value in EXCHANGE_DATA}
try:
     for code in portfolio_list:
              share_name, share_value = EXCHANGE_DATA[code]
              print('{:<6} {:<20} {:>8.2f}'.format(code, share_name, share_value))  
except KeyError:
     pass

输入示例: GPG,HNZ,DIL,FRE

输出如下:

Please list portfolio: GPG,HNZ,DIL,FRE

Code  Name                   Price
GPG   Guinnesspeat            2.32
HNZ   Heartland Nz            3.85
DIL   Diligent                5.30
FRE   Freightway              6.71

但是如果我有这样的输入:

AIR,HNZ,AAX,DIL,AZX

其中术语AAX,AZX不存在于字典(EXCHANGE_DATA)中,但术语AIR,HNZ,DIL存在。程序显然会抛出一个KeyError异常,但我已经用pass中和了这个异常。问题是在执行pass代码之后,程序退出,我需要它继续并在DIL上执行for循环。我该怎么做?


Tags: name程序sharefordataexchangevaluecode
3条回答

只需将try/except块移到for循环中。

捕获循环中的异常

for code in portfolio_list:
    try:
        share_name, share_value = EXCHANGE_DATA[code]
        print('{:<6} {:<20} {:>8.2f}'.format(code, share_name, share_value)   
    except KeyError:
        pass

编辑:测试dict是否首先拥有元素的方法更像是python

for code in portfolio_list:
    if code in EXCHANGE_DATA:
        share_name, share_value = EXCHANGE_DATA[code]
        print('{:<6} {:<20} {:>8.2f}'.format(code, share_name, share_value)   

为什么不:

 for code in portfolio_list:
     try:
         share_name, share_value = EXCHANGE_DATA[code]
         print('{:<6} {:<20} {:>8.2f}'.format(code, share_name, share_value)   
     except KeyError:
         continue

或者检查dict.get方法:

 for code in portfolio_list:
     res = EXCHANGE_DATA.get(code, None)
     if res:
         print('{:<6} {:<20} {:>8.2f}'.format(code, *res)   

正如@RedBaron提到的:

 for code in portfolio_list:
     if code in EXCHANGE_DATA:
         print('{:<6} {:<20} {:>8.2f}'.format(code, *EXCHANGE_DATA[code])   

相关问题 更多 >