如何处理异常处理程序中引发的自定义异常?

时间:2015-03-17 09:05:15

标签: python polymorphism

如果我运行以下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

这不起作用,程序执行将在打印一部分堆栈跟踪后终止。

2 个答案:

答案 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

这是因为CustomIOErrorIOError,但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)

  1. 期望子类型无法捕获超类型错误
  2. 除了A部分之外的异常抛出不能被A
  3. 旁边的除外部分捕获

    因此,如果捕获IOError,则抛出CustomIOError并处理您想要的CustomIOError 。您可以在IOError块

    之外使用try ... except块