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

Python 我应该把try/except放在哪里?,python,exception,pandas,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_s

为了改进我的编码,我想知道是应该将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)
可能看起来是一样的,但第一个例子更清楚地说明了发生了什么,而第二个例子似乎更清楚。

内部处理的可能性 如果该函数能够从异常中提供合理的恢复,并在其职责范围内处理它,而不需要任何附加信息,那么您就可以在那里捕获异常

向呼叫者提出或翻译
否则,最好由调用方来处理它。有时,即使在这种情况下,函数也可能捕获异常,然后立即使用对调用方有意义的翻译再次引发异常。一般来说,如果您预期某个特定类型的潜在异常,您将使用
try/except
。如果捕获到异常,应用程序可以在代码中处理异常的同时继续运行。例如:

try:
    user = User.objects.get(pk=id)
except ObjectDoesNotExist:
    print("could not find user")
如果您没有在try-except块中包装它,它将抛出异常,因为用户不存在。这也避免了您在尝试获取用户之前必须调用数据库来检查用户是否存在

python本身有很多内置的功能。您可以通过子类化Exception类来定义自己的异常

熊猫也有一套很好的预先定义的捕捉方法

Django还有一组(我在示例中使用了一个)


包装什么并不重要,只要处理单个异常即可。一般来说,您可以捕获它们,但是您不能完全确定抛出的是哪个异常。

这与它的外观无关,而是与您可以在何处处理异常有关

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

例如:

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