如果我运行以下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
这不起作用,程序执行将在打印一部分堆栈跟踪后终止。
答案 0 :(得分:2)
一旦异常被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
(比较:狗是动物,但(任何)动物不是狗) ,所以你的除外没有匹配。
通常,自定义异常提供了将通用错误包装到特定于应用程序的错误的方法,以便高级代码在出现问题时不必处理所有错误详细信息。例如,您有一个读取文件并将内容写入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
答案 1 :(得分:0)
因此,如果捕获IOError,则抛出CustomIOError并处理您想要的CustomIOError 。您可以在IOError块
之外使用try ... except块