内建异常类型
#!/usr/bin/python
# -*- coding: UTF-8 -*-# 異常 描述
# Exception 所有內建異常
# SystemExit 由sys.exit()產生
# StandardError 除SystemExit外所有內建異常
# ArithmeticError 所有運算異常
# FloatingPointError 浮點數運算異常
# OverflowError 數值溢出
# ZeroDivisionError 被零除
# AssertionError assert語句引起的異常
# AttributeError 屬性名稱不可用時引起
# EnvironmentError Python外部錯誤
# IOError I/O 或與文件有關的錯誤(輸入/輸出錯誤)
# OSError 操作系統錯誤
# WindowsError Windows錯誤
# EOFError 當到達一個文件的末尾時引起
# ImportError import語句失敗
# KeyboardInterrupt 鍵盤中斷(通常是 Ctrl+C)
# LookupError 索引或關鍵字錯誤
# IndexError 超出序列的范圍
# KeyError 不存在的字典關鍵字
# MemoryError 內存不足
# NameError 尋找局部或全局變量時失敗
# UnboundLocalError 未綁定變量
# RuntimeError 一般運行時錯誤
# NotImplementedError 不可實現的特征
# SyntaxError 語法錯誤
# TabError 不一致的制表符使用 (由 -tt 選項產生)
# IndentationError 縮進錯誤
# SystemError 解釋器致命錯誤
# TypeError 給一個操作傳遞了一個不適當的類型
# ValueError 值錯誤(不合適或丟失)
# UnicodeError Unicode編碼錯誤#拋出異常 raise exception [, value ]
#excepetion 異常類型 ,value 是對異常的描述# raise WindowsError,"系統錯誤"
# raise 如果沒有參數,則拋出最近一次發生的異常# try:
# f=open('foo')
# except IOError,a:#
# print 'Unable to open "foo":',a# try:
# f=open('foo')
# except: #省略參數表示:捕獲一切異常
# print 'an error occurred'
#
# try語句也支持else從句. else從句必須放在最后一個except從句后. 這塊代碼只在try塊中的語句沒有引發異常的時候運行.例如:
# try:
# f = open('foo', 'r')
# except IOError:
# print 'Unable to open foo'
# else:
# data = f.read()
# f.close()
# 復制代碼
# finally語句定義了在try塊中代碼的結束操作,例如:
# f = open('foo','r')
# try:
# # Do some stuff
# ...
# finally:
# f.close()
# print "File closed regardless of what happened."
# 復制代碼
# finally 語句并不用于捕獲異常.它用來指示無論是否發生異常都要執行的語句塊。如果沒有引起異常,finally塊中的語句將在try塊中語句執行完畢后執行;如果有異常發生,控制將先傳遞到finally塊中的第一條語句.在這塊語句執行完后,異常被自動再次引發,然后交由異常處理語句處理. finally和except語句不能在同一個try語句中出現. Table 5.1列出了Python中定義的全部內建異常類型.(關于異常的更多細節,參見附錄A)
#
# 可以通過異常名稱來訪問一個異常。例如:
# try:
# statements
# except LookupError: # 捕獲 IndexError 或 KeyError
# statements
# 或
# try:
# statements
# except StandardError: # 捕獲任何內建的異常類型
# statements
# 復制代碼
# 1.4. 定義新的異常
#
# 所有的內建異常類型都是使用類來定義的.要定義一個新的異常,就創建一個父類為exceptions.Exception的新類:
# import exceptions
# # Exception class
# class NetworkError(exceptions.Exception):
# def __init__(self,args=None):
# self.args = args
# 復制代碼
# args應該像上面那樣使用.這樣就可以使用raise語句來引發這個異常,并顯示出錯誤返回信息以及診斷,如:
#
# raise NetworkError, "Cannot find host."
#
#
# 通過調用NetworkError("Cannot find host.")可以創建一個NetworkError異常的實例. 如:
# a=NetworkError("Cannot find host.")
# print a #得到 Cannot find host.
# 復制代碼
# 如果你使用一個不是 self.args 的屬性名或你根本沒有這個屬性, 異常實例就沒有這種行為.
#
# 當使用 raise 語句有意引發一個異常時, raise語句的可選參數將做為該異常的構造函數(__init__()方法)參數.如果異常的構造函數需要一個以上參數,有兩種方法可以用來引發這種異常:
# import exceptions
# # Exception class
# class NetworkError(exceptions.Exception):
# def _ _init_ _(self,errno,msg):
# self.args = (errno, msg)
# self.errno = errno
# self.errmsg = msg
#
# # 方法一
# raise NetworkError(1, 'Host not found')
#
# # 方法二
# raise NetworkError, (1, 'Host not found')
# 復制代碼
# 基于類的這種異常體制讓你能夠輕易創建多級異常.例如,前邊定義的 NetworkError異常可以用做以下異常的基類:
# class HostnameError(NetworkError):
# pass
#
# class TimeoutError(NetworkError):
# pass
#
# def error3():
# raise HostnameError
#
# def error4():
# raise TimeoutError
#
# try:
# error3()
# except NetworkError:
# import sys
# print sys.exc_type # 打印出異常類型
# 復制代碼
# 在這個例子中except NetworkError 語句能捕獲任何從NetworkError中繼承而來的異常. 通過變量 sys.exc_type可以得到這個特殊異常的名稱. sys.exc_info()函數用于返回最近一個異常的信息(不依靠全局變量,屬于安全線程).
#
# 1.5. 斷言和__debug__
#
# assert語句用來斷言某個條件是真的,常用于程序調試. assert語句的一般格式為:
#
# assert test [, data]
#
# test是一個表達式,它返回True或False. 如果test的值為假, assert語句就引發AssertionError異常, 可選的data字符串將被傳遞給這個異常.例如:
# def write_data(file,data):
# assert file, "write_data: file is None!"
# ...
# 復制代碼
# 實際上assert語句在執行時會被實時翻譯為下面的代碼:
# if __debug__:
# if not (test):
# raise AssertionError, data
# 復制代碼
# __debug__是一個內建的只讀值,除非解釋器運行在最佳化模式(使用 -O 或 -OO 選項),否則它的值總是 True. 雖然__debug__被設計為供 assert 語句使用,你仍然可以在任何自定義調試代碼中使用它.
#
# assert 語句不能用于用來確保程序執行正確的場合,因為該語句在最佳化模式下會被忽略掉.尤其不要用assert來檢查用戶輸入. assert語句用于正常情況下應該總是為真的場合;若assert語句引發了異常,那就代表程序中存在bug,是程序員出了問題而不是用戶出現了問題.
#
# 如果打算將上邊的 write_data() 函數交付給最終用戶使用, assert語句就應該使用if語句和錯誤處理語句來重寫.
轉載于:https://www.cnblogs.com/silencekt/p/3292696.html
總結
- 上一篇: poj 3074
- 下一篇: 归档程序错误。在释放之前仅限于内部连接