关于python:用异常处理替换if-else语句

Replacing if-else statement with Exception Handling

我现在有下面的函数,其中包含一个if-else语句。在阅读了这篇文章之后,我认为最好使用try-catch异常处理。但是,我不知道该怎么做。基本上,如果输入的currency不是AUD,我想抛出下面的print语句的异常。

1
2
3
4
5
6
7
8
9
10
11
12
13
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语句。将要作为参数打印的文本传递给异常:

1
raise ValueError('This currency is not available in Database')

由于您还没有显示在哪里调用update,我不确定在哪里捕获异常是合适的。异常是有用的(而不是if/else测试)的一个原因是,如果没有有效的方法在该级别处理异常,您可以让几个函数或结构块中的异常冒泡。


使用异常处理而不是if-else语句将慢得多。

我在这里为查找字典中的键列表做了类似的比较基准,并附上了时间安排。对我来说,慢了5倍。


如果要强制处理异常,可以使用断言:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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方案),因为假设您从各种不同的货币开始,平等测试应该更快、更可读,并且能够更好地扩展到更多的货币。