Python異常繼承關係和自定義異常實現程式碼例項
阿新 • • 發佈:2020-02-20
這篇文章主要介紹了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+'))