Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jquery-ui/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 尝试…除非…否则v嵌套尝试…除非_Python - Fatal编程技术网

Python 尝试…除非…否则v嵌套尝试…除非

Python 尝试…除非…否则v嵌套尝试…除非,python,Python,向前推进: try: f = open('foo', 'r') except IOError as e: error_log.write('Unable to open foo : %s\n' % e) else: data = f.read() f.close() 我想到,else子句解决的极端情况仍然可以通过嵌套尝试来避免…除了避免需要else?: try: f = open('foo', 'r') try: data = f.read() f.cl

向前推进:

try:
  f = open('foo', 'r')
except IOError as e:
  error_log.write('Unable to open foo : %s\n' % e)
else:
  data = f.read()
  f.close()
我想到,
else子句
解决的极端情况仍然可以通过
嵌套尝试来避免…除了
避免需要
else
?:

try:
  f = open('foo', 'r')
  try:
    data = f.read()
    f.close()
  except:
    pass 
except IOError as e:
  error_log.write('Unable to open foo : %s\n' % e)

事实上,并非总是需要您可以简单地执行以下操作:

f = None
try:
  f = open('foo', 'r')
except IOError:
  error_log.write('Unable to open foo\n')
if f:
   data = f.read()
   f.close()

try..except..else
可能不需要,但也可以很好。在本例中,我认为
try..except..else
形式明显更好

仅仅因为您可以不使用语法元素,并不意味着它就没有用处。Decorator语法纯粹是语法糖(我认为这是最明显的例子),
for
循环只是美化了
,而
循环等等。有一个很好的地方可以尝试,除了,其他地方,我想说这就是这样一个地方

此外,这两段代码远远不是等价的。如果
f.read()
引发异常(磁盘读取错误、文件中的数据损坏或其他类似问题),第一个异常将引发它应该引发的异常,但第二个异常将丢失,并认为一切正常。就我自己而言,我更喜欢这样的东西,更短,更容易理解:

try:
    with open('foo', 'r') as f:
        data = f.read()
except IOError as e:
    error_log.write('Unable to open foo : %s\n' % e)

(这假设您想捕获
文件中的错误。读取
文件。关闭
。我真的不明白您为什么不这样做。)

但是,您正在调用
上的
读取()
,这会引发
属性错误
您确定“if not f”会起作用吗?我想应该是“如果你是对的”。固定的。我不该再接电话了,去睡觉吧;)这仍然很不符合Pythonic。我不知道wining answer上使用的方法非常酷。运行Python2.5时,无法使代码正常工作。我得到了无效的语法。@eryksun:啊,是的,忘了。我只是查看了Python文档,只说了“2.5版中的新版本”。没有提到需要导入的
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。Python文档中的“复合语句”页面没有提到它是何时添加的。。。我真的不记得了。