python - 之间的区别和函数前&函数中
问题描述
当我在函数之前使用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")
解决方案
在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:
子句将捕获SystemExit
和KeyboardInterrupt
异常,使使用 Control-C 中断程序变得更加困难,并且可以掩盖其他问题。如果要捕获所有表明程序错误的异常,请使用except Exception:
(bare except 等效于except BaseException:
)。一个好的经验法则是将裸“除外”子句的使用限制在两种情况下:
- 如果异常处理程序将打印或记录回溯;至少用户会意识到发生了错误。
- 如果代码需要做一些清理工作,然后让异常通过 raise 向上传播。尝试...终于可以成为处理这种情况的更好方法。
从PEP463:
任何你捕捉到你不希望捕捉到的异常的情况都是不必要的错误磁铁。
推荐阅读
- python - Django Forms UpdateView:成功更新后如何提醒用户?
- python - 在 Python 中读取特定的 Excel 单元格数据
- r - 将数据框列表转换为数据框
- javascript - chrome.runtime.onMessage 无法处理 AJAX
- node.js - AWS S3 上传后,图像损坏
- future - Vapor:在所有修改完成之前返回路由
- c# - 引导类(卡)在 asp.net 视图中不起作用
- android - 如何在统一集线器上激活构建和运行,适用于 android
- c# - DateTime.Now.ToString("M/d/yyyy HHmmss") 仅在部署位置返回月份
- c# - 如何使用构造函数访问控制器中的数据库连接