Python 使用其他try Exception块重新释放异常
我正在尝试对错误进行一些清理,然后重新引发导致错误的异常:Python 使用其他try Exception块重新释放异常,python,exception,Python,Exception,我正在尝试对错误进行一些清理,然后重新引发导致错误的异常: try: with open(filename, 'wb') as f: raise ValueError('something happened') # do something that could fail except Exception as e: # Clean up in case of any er
try:
with open(filename, 'wb') as f:
raise ValueError('something happened') # do something that could fail
except Exception as e: # Clean up in case of any error
try:
os.remove(filename)
except Exception as f: # Cleaning up could fail too, but we are not interested in that one
pass
raise # This re-raises `e` if file deletion was OK
# but re-raises `f` if file deletion was not OK
最后一个raise
语句可能会根据发生的情况升高e
或f
。这显然是不可能取代的
raise
与
因为原始回溯将被销毁。对我来说,内部异常比外部异常更重要,因此有没有办法专门提出该异常?不确定嵌套异常的问题是什么:
try:
raise ValueError('something happened')
except Exception as e:
try:
if random.randint(0,1):
raise OSError('something else happened')
except OSError:
raise
raise
例如:
import random
try:
try:
raise ValueError('something happened')
except Exception:
try:
if random.randint(0,1):
raise OSError('something else happened')
except OSError:
raise
raise
except OSError:
print('Hello')
except ValueError:
print('Goodbye')
随机打印
你好
或再见
不确定问题是什么,嵌套异常:
try:
raise ValueError('something happened')
except Exception as e:
try:
if random.randint(0,1):
raise OSError('something else happened')
except OSError:
raise
raise
例如:
import random
try:
try:
raise ValueError('something happened')
except Exception:
try:
if random.randint(0,1):
raise OSError('something else happened')
except OSError:
raise
raise
except OSError:
print('Hello')
except ValueError:
print('Goodbye')
随机打印
你好
或再见
实际上,我认为整个块可以重新组织为尝试..除了..最后
块。有什么问题吗?如果您得到一个OSError
您得到一个嵌套的异常-在处理上述异常(ValueError)的过程中,发生了另一个异常:(OSError)
否,尝试..除了..最后
在这里不起作用@AChampion我想重新引发内部异常,不管外部异常是否被抛出。为什么最终不起作用?您当前的方法仅在外部异常已引发的情况下才会引发内部异常。然后我会被“我想重新引发内部异常,无论是否引发外部异常”所迷惑。只需将pass
替换为raise
,然后如果引发内部异常,您将得到内部异常。实际上,我认为整个块可以重新组织为try..definal
块。有什么问题吗?如果您得到一个OSError
您得到一个嵌套的异常-在处理上述异常(ValueError)的过程中,发生了另一个异常:(OSError)
否,尝试..除了..最后
在这里不起作用@AChampion我想重新引发内部异常,不管外部异常是否被抛出。为什么最终不起作用?您当前的方法仅在外部异常已引发的情况下才会引发内部异常。然后,我会被“我想重新引发内部异常,无论是否引发外部异常”所迷惑。只需将pass
替换为raise
,如果引发内部异常,您将得到内部异常。