Python之異常處理
來源:程序員人生 發布時間:2015-05-22 08:40:40 閱讀次數:3130次
1、甚么是異常?
異常即是1個事件,該事件會在程序履行進程中產生,影響了程序的正常履行。
1般情況下,在Python沒法正常處理程序時就會產生1個異常。
異常是Python對象,表示1個毛病。
當Python腳本產生異常時我們需要捕獲處理它,否則程序會終止履行。
2、異常處理
捕捉異常可使用try/except語句。
try/except語句用來檢測try語句塊中的毛病,從而讓except語句捕獲異常信息并處理。
如果你不想在異常產生時結束你的程序,只需在try里捕獲它。
異常語法:
以下為簡單的try....except...else的語法:
try:
<語句> #運行別的代碼
except <名字>:
<語句> #如果在try部分引發了'name'異常
except <名字>,<數據>:
<語句> #如果引發了'name'異常,取得附加的數據
else:
<語句> #如果沒有異常產生
try的工作原理是,當開始1個try語句后,python就在當前程序的上下文中作標記,這樣當異常出現時就能夠回到這里,try子句先履行,接下來會產生甚么依賴于履行時是不是出現異常。
try...except的使用方法
try...except用于處理問題語句,捕獲可能出現的異常。try子句中的代碼塊放置可能出現異常的語句,except子句中的代碼塊處理異常。
演示try...except語句捕獲IOError異常
try:
file("hello.txt", "r") #如果文件不存在,引發異常
print "讀文件"
except IOError: #捕獲IO異常
print "文件不存在"
except: #其它異常
print "程序異常"
python與Java的異常處理模式相似,異常處理語句也能夠嵌套,演示以下:
try:
s = "hello"
try:
print s[0] + s[1]
print s[0] - s[1]
except TypeError:
print "字符串不支持減法運算"
except:
print "異常"
如果外層try子句中的代碼引發異常,程序將直接跳轉到外層try對應的except子句,而內部的try子句將不會被履行。
try...finally的使用方法
try...except后還可以添加1個finally子句。不管異常是不是產生,finally子句都會被履行。所有的finally子句通經常使用于關閉因異常而不能釋放的系統資源。
try:
f = open("hello.txt", "r")
try:
print f.read(5)
except:
print "讀文件異常"
finally:
print "釋放資源"
f.close()
except IOError:
print "文件不存在"
使用raise拋出異常
當程序出現毛病,python會自動引發異常,也能夠通過raise顯示地引發異常。1旦履行了raise語句,raise后面的語句將不能履行。
演示raise用法
try:
s = None
if s is None:
print "s 是空對象"
raise NameError #如果引發NameError異常,后面的代碼將不能履行
print len(s)
except TypeError:
print "空對象沒有長度"
自定義異常
python允許程序員自定義異常,用于描寫python中沒有觸及的異常情況,自定義異常必須繼承Exception類,自定義異常依照命名規范以"Error"結尾,顯示地告知程序員這是異常。自定義異常使用raise語句引發,而且只能通過人工方式觸發。
from __future__ import division
class DivisionException(Exception):
def __init__(self, x, y):
Exception.__init__ (self, x, y) #調用基類的__init__進行初始化
self.x = x
self.y = y
if __name__ == "__main__":
try:
x = 3
y = 2
if x % y > 0: #如果大于0, 則不能被初始化,拋出異常
print x/y
raise DivisionException(x, y)
except DivisionException,div: #div 表示DivisionException的實例對象
print "DivisionExcetion: x/y = %.2f" % (div.x/div.y)
assert語句的使用
assert語句用于檢測某個條件表達式是不是為真。assert語句又稱為斷言語句,即assert認為檢測的表達式永久為真,if語句中的條件判斷都可使用assert語句檢測。
附:python標準異常
BaseExceptiona:所有異常的基類
SystemExitb python:解釋器要求退出
KeyboardInterruptc:用戶中斷履行(通常是輸入^C)
Exceptiond:常規毛病的基類
StopIteratione:迭代器沒有更多的值
GeneratorExita:生成器(generator)產生異常來通知退出
SystemExith:Python 解釋器要求退出
StandardErrorg:所有的內建標準異常的基類
ArithmeticErrord:所有數值計算毛病的基類
FloatingPointErrord:浮點計算毛病
OverflowError:數值運算超越最大限制
ZeroDivisionError:除(或取模)零 (所有數據類型)
AssertionErrord:斷言語句失敗
AttributeError:對象沒有這個屬性
EOFError:沒有內建輸入,到達EOF 標記
EnvironmentErrord:操作系統毛病的基類
IOError:輸入/輸出操作失敗
OSErrord:操作系統毛病
WindowsErrorh Windows:系統調用失敗
ImportError:導入模塊/對象失敗
KeyboardInterruptf:用戶中斷履行(通常是輸入^C)
LookupErrord:無效數據查詢的基類
IndexError:序列中沒有無此索引(index)
KeyError:映照中沒有這個鍵
MemoryError:內存溢出毛病(對Python 解釋器不是致命的)
NameError:未聲明/初始化對象 (沒有屬性)
UnboundLocalErrorh:訪問未初始化的本地變量
ReferenceErrore:弱援用(Weak reference)試圖訪問已垃圾回收了的對象
RuntimeError:1般的運行時毛病
NotImplementedErrord:還沒有實現的方法
SyntaxError:Python 語法毛病
IndentationErrorg:縮進毛病
TabErrorg:Tab 和空格混用
SystemError 1般的解釋器系統毛病
TypeError:對類型無效的操作
ValueError:傳入無效的參數
UnicodeErrorh:Unicode 相干的毛病
UnicodeDecodeErrori:Unicode 解碼時的毛病
UnicodeEncodeErrori:Unicode 編碼時毛病
UnicodeTranslateErrorf:Unicode 轉換時毛病
Warningj:正告的基類
DeprecationWarningj:關于被棄用的特點的正告
FutureWarningi:關于構造將來語義會有改變的正告
OverflowWarningk:舊的關于自動提升為長整型(long)的正告
PendingDeprecationWarningi:關于特性將會被廢棄的正告
RuntimeWarningj:可疑的運行時行動(runtime behavior)的正告
SyntaxWarningj:可疑的語法的正告
UserWarningj:用戶代碼生成的正告
Python的Exception層次結構
Exception
|
+-- SystemExit
+-- StopIteration
+-- StandardError
| |
| +-- KeyboardInterrupt
| +-- ImportError
| +-- EnvironmentError
| | |
| | +-- IOError
| | +-- OSError
| | |
| | +-- WindowsError
| | +-- VMSError
| |
| +-- EOFError
| +-- RuntimeError
| | |
| | +-- NotImplementedError
| |
| +-- NameError
| | |
| | +-- UnboundLocalError
| |
| +-- AttributeError
| +-- SyntaxError
| | |
| | +-- IndentationError
| | |
| | +-- TabError
| |
| +-- TypeError
| +-- AssertionError
| +-- LookupError
| | |
| | +-- IndexError
| | +-- KeyError
| |
| +-- ArithmeticError
| | |
| | +-- OverflowError
| | +-- ZeroDivisionError
| | +-- FloatingPointError
| |
| +-- ValueError
| | |
| | +-- UnicodeError
| | |
| | +-- UnicodeEncodeError
| | +-- UnicodeDecodeError
| | +-- UnicodeTranslateError
| |
| +-- ReferenceError
| +-- SystemError
| +-- MemoryError
|
+---Warning
|
+-- UserWarning
+-- DeprecationWarning
+-- PendingDeprecationWarning
+-- SyntaxWarning
+-- OverflowWarning
+-- RuntimeWarning
+-- FutureWarning
參考文獻:
http://blog.chinaunix.net/uid⑵1505614-id⑶618285.html
http://www.phperz.com/article/14/1009/14507.html
http://blog.chinaunix.net/uid⑵2920230-id⑶074716.html
生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈