我应该把try / except放在哪里?

时间:2015-07-25 23:20:12

标签: python exception pandas

为了改进我的编码,我想知道是否应该将try / except放在函数内部或将其保留在外面。以下示例显示了我的意思。

    import pandas as pd

    df = pd.read_csv("data.csv")

    # Example 1
    def do_something(df):
        # Add some columns
        # Split columns
        return df

    try:
        df = do_something(df)
    except Exception, e:
        print e

    # Example 2
    def do_something(df):
        try:
            # Add some columns
            # Split columns
        except Exception, e:
            print e
            df = pd.DataFrame()
        return df

    df = do_something(df)

看起来可能是一样的,但第一个例子更明确的是发生了什么,而第二个看起来更干净。

3 个答案:

答案 0 :(得分:5)

内部处理的可能性

如果该函数可以从异常中提供明智的恢复并在其职责范围内处理并且没有任何其他信息,那么您可以在那里捕获异常

提升或转换为来电者

否则,可能最好由调用者来处理它。有时甚至在这种情况下,函数可能会捕获异常,然后立即使用对调用者有意义的转换再次引发它

答案 1 :(得分:3)

它与它的外观无关,它与你在哪里处理异常有关。

如果可以在函数内部处理异常 - 在那里使用它。如果它不能 - 在功能之外使用它。

举个例子:

def pi():
    try:
        return get_awsome_pi_value_from_internetz()
    except NoInternetzError:
        # recover
        return 3.14

或者无法处理错误的示例:

def get_square_root(x):
    return x ** 0.5

其他代码:

try:
    get_square_root(-1) # imagine -1 was received from user
except ValueError:
    print("Can't find a sensible root for value.")
    # recover / panic

答案 2 :(得分:2)

一般来说,如果您预计特定类型可能存在异常,则可以使用try/except。如果捕获异常,则在代码中处理异常时,应用程序可以继续运行。例如:

try:
    user = User.objects.get(pk=id)
except ObjectDoesNotExist:
    print("could not find user")

如果你没有将它包装在try except块中,它会抛出异常,因为用户不存在。这也使您无需在尝试获取用户之前调用数据库来检查用户是否存在。

python本身有很多内置的exceptions。您可以通过继承Exception类来定义自己的类。

Pandas也有一套好的预先定义的exceptions来抓住。

Django还有一组exceptions(我在我的例子中使用了一个)

只要你处理个别例外,你包装什么都没关系。你可以一般地捕捉它们,但是你不能完全确定抛出的是什么异常。