首页 > 解决方案 > 之间的区别函数前&函数中

问题描述

当我在函数之前使用try时,它会引发错误。但如果我函数中使用它就可以了。为什么?(这些代码的评估顺序是什么?)。任何帮助表示赞赏。

try:
    def chiz(dict, key):
        return dict[key]
except:
    print("somethig went wrong")
user_01 = {
    "name": "armin",
    "age": 20.51
}
chiz(user_01, "weight")

>>>Traceback (most recent call last):
  File "C:\Users\user\PycharmProjects\pythonWhile\test.py", line 11, in <module>
    chiz(user_01, "weight")
  File "C:\Users\user\PycharmProjects\pythonWhile\test.py", line 3, in chiz
    return dict[key]
KeyError: 'weight'


def chiz(dict, key):
    try:
        return dict[key]

    except :
        print("somethig went wrong")

user_01 = {
    "name": "armin",
    "age": 20.51
}

chiz(user_01, "weight")

标签: pythontry-except

解决方案


try您的第一个示例中,在调用函数时不会评估,仅在首次定义函数时才会评估,此时不会引发异常。

直到您实际使用参数调用函数,其中键在给定字典中不存在时,才会实际引发异常并且不会评估 try/except 子句。

你的第二个例子是做你想做的事情的正确方法:

In [4]: def chiz(dict, key): 
   ...:     try: 
   ...:         return dict[key] 
   ...:     except: 
   ...:         print("Something went wrong") 
   ...:                                                                         

In [5]: chiz(user_01, "weight")                                                 
Something went wrong

话虽如此,请重新考虑那个裸露的 except 子句。这相当于说except BaseException:这可能不是您想要的并且违反了PEP8 建议。在这种情况下,您可能应该使用except KeyError:或,最广泛地说,except Exception:.

捕获异常时,尽可能提及特定异常,而不是使用裸except:子句。一个简单的except:子句将捕获SystemExitKeyboardInterrupt异常,使使用 Control-C 中断程序变得更加困难,并且可以掩盖其他问题。如果要捕获所有表明程序错误的异常,请使用except Exception:(bare except 等效于except BaseException:)。一个好的经验法则是将裸“除外”子句的使用限制在两种情况下:

  • 如果异常处理程序将打印或记录回溯;至少用户会意识到发生了错误。
  • 如果代码需要做一些清理工作,然后让异常通过 raise 向上传播。尝试...终于可以成为处理这种情况的更好方法。

PEP463

任何你捕捉到你不希望捕捉到的异常的情况都是不必要的错误磁铁。


推荐阅读