主要介紹 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+'))