python 異常繼承關系及自定義異常的實現


主要介紹 python 中異常的繼承關系,及如何自定義異常

1. 異常的繼承關系

BaseException    # 所有異常的基類
 +-- SystemExit    # 解釋器請求退出
 +-- KeyboardInterrupt     用戶中斷執行(通常是輸入^C)
 +-- GeneratorExit    # 生成器(generator)發生異常來通知退出
 +-- Exception    # 常規異常的基類
      +-- StopIteration    # 迭代器沒有更多的值
      +-- StandardError    # 標准錯誤
      |    +-- BufferError
      |    +-- ArithmeticError
      |    |    +-- FloatingPointError
      |    |    +-- OverflowError
      |    |    +-- ZeroDivisionError
      |    +-- AssertionError
      |    +-- AttributeError
      |    +-- EnvironmentError
      |    |    +-- IOError
      |    |    +-- OSError
      |    |         +-- WindowsError (Windows)
      |    |         +-- VMSError (VMS)
      |    +-- EOFError
      |    +-- ImportError
      |    +-- LookupError
      |    |    +-- IndexError
      |    |    +-- KeyError
      |    +-- MemoryError
      |    +-- NameError
      |    |    +-- UnboundLocalError
      |    +-- ReferenceError
      |    +-- RuntimeError
      |    |    +-- NotImplementedError
      |    +-- SyntaxError
      |    |    +-- IndentationError
      |    |         +-- TabError
      |    +-- SystemError
      |    +-- TypeError
      |    +-- ValueError
      |         +-- UnicodeError
      |              +-- UnicodeDecodeError
      |              +-- UnicodeEncodeError
      |              +-- UnicodeTranslateError
      +-- Warning
           +-- DeprecationWarning
           +-- PendingDeprecationWarning
           +-- RuntimeWarning
           +-- SyntaxWarning
           +-- UserWarning
           +-- FutureWarnin
           +-- ImportWarnin
           +-- UnicodeWarnin
           +-- BytesWarning

2. 自定義異常

#自定義異常 需要繼承Exception
class MyException(Exception):

    def __init__(self, *args):
        self.args = args

if __name__ == '__main__':
    try:
        raise MyException("自定義異常")
    except MyException as e:
        print e

3. 異常捕獲

# 示例
str1 = 'abc'
try:
    int(str1)
except IndexError as e:
    print e
except KeyError as e:
    print e
except ValueError as e:
    print e
else:
    print 'try內正常處理'
finally:
    print '無論異常與否,都會執行我'

4. 主動觸發異常

# raise xxx
def test_zero(num):
    try:
        if num == 0:
            raise ValueError('參數錯誤')
        return num
    except Exception as e:
        print e

test_zero(0)

5. 采用traceback模塊查看異常

異常發生時,Python 能“記住”引發的異常以及程序的當前狀態。
Python 維護着traceback(跟蹤)對象,其中含有異常發生時與函數調用堆棧有關的信息。
異常可能在一系列嵌套較深的函數調用中引發。
程序調用每個函數時,Python 會在“函數調用堆棧”的起始處插入函數名。一旦異常被引發,Python 會搜索一個相應的異常處理程序。如果當前函數中沒有異常處理程序,當前函數會終止執行,Python 會搜索當前函數的調用函數,並以此類推,直到發現匹配的異常處理程序,或者Python 抵達主程序為止。這一查找合適的異常處理程序的過程稱為“堆棧輾轉開解”(StackUnwinding)。
解釋器一方面維護着與放置堆棧中的函數有關的信息,另一方面也維護着與已從堆棧中“輾轉開解”的函數有關的信息。
#示例
def div(num1, num2):
    try:
        result = num1/num2
        return result
    except Exception as e:
        traceback.print_exc()

print div(1, 0)
#執行結果
Traceback (most recent call last):
None
  File "F:/Technology-20161005/python/python_project/demo/exceptiondemo/exceptiondemo.py", line 17, in div
    result = num1/num2
ZeroDivisionError: integer division or modulo by zero
# 可以將異常信息寫到文件中
traceback.print_exc(file=open('1.txt','w+'))


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM