保持继续代码不会在尝试中失败...除外?

Vai*_*pai 0 python

潜入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

Joh*_*Doe 6

最常被接受的标准是尽可能少地将代码放在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)


zee*_*kay 6

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)