潜入Python -
这是fileinfo.py本书中使用的一小段.这是打开MP3文件并读取最后128个字节以获取并稍后解析元数据.
try:
fsock = open(filename, "rb", 0)
try:
fsock.seek(-128, 2)
tagdata = fsock.read(128)
finally:
fsock.close()
.
. # process tagdata: will NEVER raise IOError though
.
except IOError:
pass
Run Code Online (Sandbox Code Playgroud)
这可以重构为:
try:
fsock = open(filename, "rb", 0)
try:
fsock.seek(-128, 2)
tagdata = fsock.read(128)
except IOError:
pass
finally:
fsock.close()
.
. # process tagdata
.
Run Code Online (Sandbox Code Playgroud)
在我学习的时候,我甚至习惯了这个问题Java.我们是否应该保留可以在try..except块内实际引发异常的逻辑,或者为了保持在一个地方执行某项特定工作的代码; 保留其他代码,永远不会在一个try...except?
最常被接受的标准是尽可能少地将代码放在try ...中.推理是,如果在尝试中有大量代码,你不知道其他代码将会引发什么 ...然后它变得非常混乱.
您可以在PEP 8中看到许多好的样式信息,其中包括:
- Additionally, for all try/except clauses, limit the 'try' clause
to the absolute minimum amount of code necessary. Again, this
avoids masking bugs.
Yes:
try:
value = collection[key]
except KeyError:
return key_not_found(key)
else:
return handle_value(value)
No:
try:
# Too broad!
return handle_value(collection[key])
except KeyError:
# Will also catch KeyError raised by handle_value()
return key_not_found(key)
Run Code Online (Sandbox Code Playgroud)
该try/ finally条款的主要目的是关闭文件,无论发生什么,它没有任何意义,将其移动外try/ except因为我假设你正在尝试做的:
try:
fsock = open(filename, "rb", 0)
try:
fsock.seek(-128, 2)
tagdata = fsock.read(128)
except:
pass
except IOError:
pass
finally:
fsock.close()
Run Code Online (Sandbox Code Playgroud)
原因是,如果IOError实际提出,则调用fsock.close()将引发另一个异常,因为fsock不会被分配.而不是其中之一,最好使用with自动关闭文件的语句:
try:
with open(filename, 'rb') as fsock:
fsock.seek(-128, 2)
tagdata = fsock.read(128)
except IOError:
pass
Run Code Online (Sandbox Code Playgroud)