[英]How to handle a custom exception raised inside an exception handler?
如果我运行以下Python脚本并假设我的文件读取将失败,则IOError处理程序将引发自定义异常,但是我不确定应如何处理所引发的自定义异常。 谁能帮忙吗?
class CustomIOError(IOError):
def __init__(self, msg):
super(CustomIOError, self).__init__()
self.error_msg = msg
try:
# Open file to read
with open(fileName) as f:
for line in f:
print line,
except IOError :
raise CustomIOError('Exception message')
# except CustomIOError :
# sys.exit(0)
另外,如果Python支持多态,为什么我不能使用派生类的异常处理程序直接处理基类的异常?
try:
raise IOError
except CustomIOError:
pass
这将不起作用,程序执行将在打印部分堆栈跟踪信息后终止。
一旦异常被except
子句捕获,同一块中的任何后续except
将被忽略,因此您不能这样做:
try:
...
except Something:
raise MyError
except MyError: <-- won't work!
....
您需要对整个过程进行另一次try
:
try:
try:
...
except Something:
raise MyError
except MyError: <-- will work
...
对于第二个问题,它的工作方式却相反:
try:
raise CustomIOError
except IOError: <-- works
pass
这是因为CustomIOError
是IOError
,但是IOError
不是CustomIOError
(比较:dog是动物,但(any)动物不是狗),因此您的except不匹配。
通常,自定义异常提供了一种将通用错误包装到特定于应用程序的异常中的方法,这样,当发生错误时,高级代码不必处理所有错误细节。 例如,您具有一个读取文件并将内容写入sql数据库的功能。 调用此函数的代码仅想知道它是成功还是失败,细节无关紧要(尽管以后应记录下来以进行调查)。 因此,该函数仅引发一个异常以指示其失败:
# higher-level code
class UserInterface:
def writeButtonClick:
try:
readAndWrite()
except ReadAndWriteFailure:
showMessage("Problem! Please try again")
# lower-level code
class ReadAndWriteFailure(Exception):
pass
def readAndWrite():
try:
fp = open(someFile)
db = sql.connection()
for line in fp:
db.execute(line)
except IOError:
log it
raise ReadAndWriteFailure()
except SQLError:
log it
raise ReadAndWriteFailure()
etc
因此,如果捕获IOError,则抛出CustomIOError并处理您想要的CustomIOError 。 您可以在IOError块之外使用try ... except块
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.