一個Python程序在運行時,如果解釋器遇到到一個錯誤,會停止程序的執行,並且提示一些錯誤信息,這就是異常(Exception)。即便Python程序的語法是正確的,還是會有各種各樣意想不到的異常或錯誤。大多數的異常都不會被程序處理,而是以錯誤信息的形式展現出來,如下所示:
>>> 10 * (1/0)
Traceback (most recent call last):
File "<stdin>", line 1, in ?
ZeroDivisionError: division by zero
>>> 4 + spam*3
Traceback (most recent call last):
File "<stdin>", line 1, in ?
NameError: name 'spam' is not defined
>>> '2' + 2
Traceback (most recent call last):
File "<stdin>", line 1, in ?
TypeError: Can't convert 'int' object to str implicitly
異常以不同的類型出現,這些類型都作為信息的一部分列印出來: 例子中的類型有 ZeroDivisionError,NameError 和 TypeError。
Python的內建異常
Python的一些常見內建異常如下所示,這些都是你必須熟知和掌握的。
Exception 常規錯誤的基類
AttributeError 對象沒有這個屬性
IOError 輸入/輸出操作失敗
IndexError 序列中沒有此索引(index)
KeyError 映射中沒有這個鍵
NameError 未聲明/初始化對象 (沒有屬性)
SyntaxError Python 語法錯誤
TypeError 對類型無效的操作
ValueError 傳入無效的參數
ZeroDivisionError 除(或取模)零 (所有數據類型)
完整內置異常見下圖:
沒有異常處理的特點是出現異常會終止程序執行。比如下例中當你輸入的x不是整數時,程序會立刻中止並拋出異常,ok和end不會被列印。
print("start")
x = int(input("Please enter a number: "))
print("number:",x)
print("ok....")
print("end")
使用了有異常處理的代碼,程序會執行到最後。
print("start")
try:
x = int(input("Please enter a number: "))
print("number:",x)
print("ok....")
except ValueError:
print("Oops! That was no valid number. Try again")
print("end")
try語句按照如下方式工作;
首先,執行try子句(在關鍵字try和關鍵字except之間的語句)
如果沒有異常發生,忽略except子句,try子句執行後結束。
如果在執行try子句的過程中發生了異常,那麼try子句餘下的部分將被忽略。如果異常的類型和 except 之後的名稱相符,那麼對應的except子句將被執行。最後執行 try 語句之後的代碼。
如果一個異常沒有與任何的except匹配,那麼這個異常將會傳遞給上層的try中。
一個 try 語句可能包含多個except子句,分別來處理不同的特定的異常。最多只有一個分支會被執行。最後一個except子句可以忽略異常的名稱,它將被當作通配符使用。你可以使用這種方法列印一個錯誤信息,然後再次把異常拋出。
import sys
try:
f = open('myfile.txt')
s = f.readline()
i = int(s.strip())
except OSError as err:
print("OS error: {0}".format(err))
except ValueError:
print("Could not convert data to an integer.")
except:
print("Unexpected error:", sys.exc_info()[0])
raise
一個except子句可以同時處理多個異常,這些異常將被放在一個括號裡成為一個元組,例如:
except (RuntimeError, TypeError, NameError):
pass
我們用一個實例體會下關於try語句的要點。
print("start")
try:
x = int(input("Please enter a number: "))
print("number:",x)
print(100/x)
print("ok....")
except ValueError:
print("非純數字錯誤!")
except ZeroDivisionError:
print("不可以為零錯誤!")
except:
print("可選的未知錯誤!")
print("end")
print("start")
try:
x = int(input("Please enter a number: "))
print("number:",x)
print(100/x)
print("ok....")
except (ValueError,ZeroDivisionError):
print("非純數字或不可以為零錯誤!")
except:
print("可選的未知錯誤!")
raise #重新拋出這個異常
print("end")
Python 使用 raise 語句拋出一個指定的異常。例如:
>>> raise NameError('HiThere')
Traceback (most recent call last):
File "<stdin>", line 1, in ?
NameError: HiThere
>>> try:
raise NameError('HiThere')
except NameError:
print('An exception flew by!')
raise
An exception flew by!
Traceback (most recent call last):
File "<stdin>", line 2, in ?
NameError: HiThere
參考原文:
https://edu.csdn.net/notebook/python/week02/2.html
相關閱讀
一文看懂Python多進程與多線程編程(工作學習面試必讀)
一文看懂Python系列之裝飾器(decorator)(工作面試必讀)
一文看懂Python面向對象編程(Python學習與新手入門必看)-絕對原創