1. 程式人生 > 程式設計 >Python異常繼承關係和自定義異常實現程式碼例項

Python異常繼承關係和自定義異常實現程式碼例項

這篇文章主要介紹了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+'))