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

Python 如何处理异常处理程序中引发的自定义异常?,python,polymorphism,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

如果我运行下面的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
这将不起作用,程序执行将在打印堆栈跟踪的一部分后终止

  • expect子类型无法捕获超级类型错误
  • A旁边的exception部分无法捕获从exception部分A引发的异常

  • 因此,如果捕获IOError,抛出CustomIOError并处理您想要的CustomIOError。您可以在IOError块之外使用try…except块

    一旦异常被
    except
    子句捕获,同一块中的任何后续异常都将被忽略,因此您不能这样做:

    try:
       ...
    except Something:
       raise MyError
    except MyError: <-- won't work!
      ....
    
    对于第二个问题,它以另一种方式工作:

    try:
      raise CustomIOError
    except IOError: <-- works
      pass
    

    如果你
    raisecustomioerror
    你应该
    除了CustomIOError
    @Marcus:我不完全清楚你为什么首先需要这个,你能给我们展示一个更大的图片吗?你的程序做什么,为什么你需要自定义异常等等?我恐怕还没有大的图片。我刚刚开始构建一个库,在某种程度上,我决定使用python(第一次),我之所以尝试,是因为我发现它很有趣。事实上,我还想知道什么时候应该真正使用自定义异常,所以如果您能分享一些关于这方面的建议,那将非常有用。谢谢。@Marcus:添加了一些解释和示例。
    try:
      raise CustomIOError
    except IOError: <-- works
      pass
    
    # 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