python - 当我无法处理异常时,为什么退出代码为零(“好”)?
问题描述
考虑以下代码片段和来自控制台的打印输出:
片段 1
表现得很好。一切都是hunkydory。
代码
try:
raise ValueError()
finally:
print(3)
控制台输出
Traceback (most recent call last):
File "D:/FILE_MGMT_PYTHON/fbzdfbhedrh.py", line 5, in <module>
raise ValueError()
ValueError
3
片段 2
也表现得很好。一切都是hunkydory。
代码
try:
raise ValueError()
except type("", (Exception,), dict()):
print("this is not supposed to print")
finally:
print(3)
控制台输出
3
Traceback (most recent call last):
File "D:/FILE_MGMT_PYTHON/fbzdfbhedrh.py", line 14, in <module>
raise ValueError()
ValueError
片段 3
我不明白为什么以下内容不会导致未处理的异常被打印到控制台:
代码
def e():
try:
raise ValueError()
x = y + z
L = [1, 2, 3]
print(L[9999999999999999999999999999])
except type("", (Exception,), dict()) as exc:
print("this is not supposed to print")
return "strawberries " + src(exc)
finally:
return "finally"
print(e())
控制台输出
finally
Process finished with exit code 0
建造:
------------------
System Information
------------------
Time of this report: 10/25/2019, 07:22:01
Machine name: DESKTOP-U5M46TJ
Machine Id: {403D9006-3BF1-4C4B-AAF5-2AD795E00738}
Operating System: Windows 10 Pro 64-bit (10.0, Build 18362) (18362.19h1_release.190318-1202)
Language: English (Regional Setting: English)
System Manufacturer: System manufacturer
System Model: System Product Name
BIOS: BIOS Date: 10/31/12 20:41:07 Ver: 36.02 (type: BIOS)
Processor: Intel(R) Core(TM) i5-2500K CPU @ 3.30GHz (4 CPUs), ~3.3GHz
Memory: 4096MB RAM
Available OS Memory: 4064MB RAM
Page File: 12606MB used, 3744MB available
Windows Dir: C:\Windows
DirectX Version: DirectX 12
DX Setup Parameters: Not found
User DPI Setting: 96 DPI (100 percent)
System DPI Setting: 144 DPI (150 percent)
DWM DPI Scaling: UnKnown
Miracast: Available, with HDCP
Microsoft Graphics Hybrid: Not Supported
DirectX Database Version: Unknown
DxDiag Version: 10.00.18362.0387 64bit Unicode
------------------
IDE Information
------------------
PyCharm 2019.1.3 (Community Edition)
Build #PC-191.7479.30, built on May 29, 2019
JRE: 11.0.2+9-b159.60 amd64
JVM: OpenJDK 64-Bit Server VM by JetBrains s.r.o
Windows 10 10.0
------------------
Python Information
------------------
print(sys.version)
print(sys.version_info)
print(sys.hexversion)
3.8.0 (tags/v3.8.0:fa919fd, Oct 14 2019, 19:21:23) [MSC v.1916 32 bit (Intel)]
sys.version_info(major=3, minor=8, micro=0, releaselevel='final', serial=0)
50856176
解决方案
从finally
块中返回会丢弃异常。该函数无法返回并引发异常,并且您告诉它您希望它返回。
将抛出异常,但在try
退出语句之前,finally
需要运行该块。你的finally
块说“不管你认为你在做什么,我都想回来”。所以异常被丢弃。
同样,如果您从一个块返回try
,并且该finally
块引发异常,则返回值将被丢弃。
请参阅Python 文档中的定义清理操作:
- 如果在子句执行过程中发生
try
异常,该异常可以由except
子句处理。如果子句未处理except
异常,则在执行子句后重新引发异常finally
。
...- 如果
finally
子句包含 return 语句,则finally
子句的 return 语句将在子句中的 return 语句之前执行,而不是执行try
。
推荐阅读
- google-chrome - 无法在 Chrome / Edge 中打开 PowerApps
- php - 在laravel中使用vue-router时无法获取url
- java - 如何从 mac OS Big Sur 中删除多个 java 版本?
- python-3.x - lambda函数如何与python中的reduce函数一起工作?
- powershell - 在powershell中访问blob json的键值对
- abaqus - 如何使用 abaqus 结果的虚值到 isight?
- javascript - 无法通过 Mongodb 中的下一个身份验证在登录时将自定义字段添加到用户模型
- flutter - 流调用两次,listView数据变成重复
- j - 默写 4 : 'x&{.&.;: y'
- deep-learning - 在 Raspberrypi 的配置文件中找不到模型