我该在哪里放置try/except语句?

5
为了提高我的编码能力,我想知道是否应该把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个回答

5

内部处理的可能性

如果该函数能够合理地从异常中恢复,并且在其职责范围内且没有其他附加信息的情况下进行处理,则可以在此处捕获异常

上抛或向调用器翻译

否则,最好让调用者来处理。有时,在这种情况下,该函数可能会捕获异常,然后立即将其再次上抛,并使用对调用者有意义的翻译


4

这与外观无关,与异常处理的位置有关。

如果异常可以在函数内部处理-请在其中使用。 如果无法处理,请在函数外部使用。

例如:

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
一般来说,如果您预计可能会出现特定类型的异常,您将使用try/except。如果捕获到异常,您的应用程序可以在您处理代码中的异常的同时继续运行。例如:
try:
    user = User.objects.get(pk=id)
except ObjectDoesNotExist:
    print("could not find user")

如果你没有将其放在try except块中,它会抛出异常,因为用户不存在。这也可以避免在尝试获取用户之前调用数据库来检查用户是否存在。
Python本身有很多内置的异常。你可以通过子类化Exception类来定义自己的异常。
Pandas还有一套很好的预定义异常可供捕获。
Django也有一套异常(我在我的例子中使用了其中一个)。
无论你包裹什么,只要处理单个异常即可。你可以通常捕获它们,但是你不完全确定抛出了哪个异常。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接