我目前有下面的函数,里面有一个if-else
语句。阅读这篇文章后,我认为最好使用try-catch
异常处理。但是,我不确定如何做到这一点。基本上,如果输入的currency
不是AUD
我想用下面的print
语句抛出一个异常。
def update(self, currency):
if self.currency == 'AUD':
url = 'http://www.rba.gov.au/statistics/tables/csv/f17-yields.csv'
response = urllib2.urlopen(url)
text = response.read()
csvfile = StringIO.StringIO(text)
df = pd.read_csv(csvfile)
print df
else:
print('This currency is not available in Database')
您通常不希望在同一位置引发和捕获异常。相反,您希望在首次发现错误的位置引发异常,并在报告问题有意义的任何位置捕获它。
在您显示的代码中,您只想将 print
调用替换为 raise
语句,可能是ValueError
语句。将要打印的文本作为参数传递给异常:
raise ValueError('This currency is not available in Database')
由于您尚未显示调用update
的位置,因此我不确定在哪里捕获异常是合适的。异常有用的一个原因是(而不是if
/else
测试),如果没有有用的方法来处理异常,你可以让异常从几个函数或结构块中冒出来。
使用异常处理而不是 if-else
语句会慢得多。
我已经对类似的比较进行了基准测试,以便在字典中查找键列表,并附上计时。对我来说,它慢了 5 倍。
强制异常处理,可以使用断言:
def update(self, currency):
try:
assert self.currency == 'AUD'
url = 'http://www.rba.gov.au/statistics/tables/csv/f17-yields.csv'
response = urllib2.urlopen(url)
text = response.read()
csvfile = StringIO.StringIO(text)
df = pd.read_csv(csvfile)
print df
except AssertionError:
print('This currency is not available in Database')
在这种情况下不一定理想(在我看来,这是一个 LBYL 场景),因为相等性测试应该更快、更具可读性,并且更好地扩展到更多货币,假设您从各种不同的货币开始。