将 if-else 语句替换为异常处理



我目前有下面的函数,里面有一个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 场景),因为相等性测试应该更快、更具可读性,并且更好地扩展到更多货币,假设您从各种不同的货币开始。

最新更新