1. 程式人生 > >Python 基礎之 異常處理

Python 基礎之 異常處理

判斷 簡單 不讓 tor pen opened 分支結構 子類 inpu

python 基礎之異常處理

說到異常處理,就得先問一下,什麽是異常處理? 先來看一下,什麽是異常? 異常就是:程序運行時發出的錯誤的信號。

異常的種類先來看一下:

一、常見的異常

AttributeError 試圖訪問一個對象沒有的樹形,比如foo.x,但是foo沒有屬性x
IOError 輸入/輸出異常;基本上是無法打開文件
ImportError 無法引入模塊或包;基本上是路徑問題或名稱錯誤
IndentationError 語法錯誤(的子類) ;代碼沒有正確對齊
IndexError 下標索引超出序列邊界,比如當x只有三個元素,卻試圖訪問x[5]
KeyError 試圖訪問字典裏不存在的鍵
KeyboardInterrupt Ctrl
+C被按下 NameError 使用一個還未被賦予對象的變量 SyntaxError Python代碼非法,代碼不能編譯(個人認為這是語法錯誤,寫錯了) TypeError 傳入對象類型與要求的不符合 UnboundLocalError 試圖訪問一個還未被設置的局部變量,基本上是由於另有一個同名的全局變量, 導致你以為正在訪問它 ValueError 傳入一個調用者不期望的值,即使值的類型是正確的

二、不常見的異常

技術分享
ArithmeticError
AssertionError
AttributeError
BaseException
BufferError
BytesWarning
DeprecationWarning
EnvironmentError
EOFError
Exception
FloatingPointError
FutureWarning
GeneratorExit
ImportError
ImportWarning
IndentationError
IndexError
IOError
KeyboardInterrupt
KeyError
LookupError
MemoryError
NameError
NotImplementedError
OSError
OverflowError
PendingDeprecationWarning
ReferenceError
RuntimeError
RuntimeWarning
StandardError
StopIteration
SyntaxError
SyntaxWarning
SystemError
SystemExit
TabError
TypeError
UnboundLocalError
UnicodeDecodeError
UnicodeEncodeError
UnicodeError
UnicodeTranslateError
UnicodeWarning
UserWarning
ValueError
Warning
ZeroDivisionError

更多異常
更多的異常

接下來再談何為異常處理?

python解釋器檢測到錯誤,觸發異常(也允許程序員自己觸發異常)

程序員編寫特定的代碼,專門用來捕捉這個異常(這段代碼與程序邏輯無關,與異常處理有關)

如果捕捉成功則進入另外一個處理分支,執行你為其定制的邏輯,使程序不會崩潰,這就是異常處理

還有個現實的問題就是,為何要進行異常處理呢? 這個問題問的很有價值,進行異常處理就是為了讓程序更加的健壯,防止程序在運行過程中奔潰!!!

那如何進行異常處理呢?if 是否可以進行異常處理呢?是不是異常處理的方式只有 try .......except ...finally 這一種方式呢?

好了,現在就統一說明一下,if 是可以進行異常的處理的,但是if 在進行異常處理的過長中會有許多的問題:

1.if判斷式的異常處理只能針對某一段代碼,對於不同的代碼段的相同類型的錯誤你需要寫重復的if來進行處理。

2.在你的程序中頻繁的寫與程序本身無關,與異常處理有關的if,就像是在你的代碼中到處拉屎。可讀性極其的差

3.這是可以解決異常的,只是存在1,2的問題,所以,千萬不要妄下定論if不能用來異常處理。

我們再來看一下用 try .....except ...finally 的方式處理異常的基本方法

1. 基本語法:

1 try:
2     被檢測的代碼塊
3 except 異常類型:
4     try中一旦檢測到異常,就執行這個位置的邏輯

2.異常處理完整版:

try:
    a = input(>>>\n)
    int(a)
    b = input(>>>\n)
    int(b)
except ValueError as e :
    print(e)

else:
    print(你就是個大傻逼!!!!!)
finally:
    print(無論如何我都要執行!!!)


except 的代碼塊可以寫多個,就是呢向if else中的else一樣的多分支結構

3.主動觸發異常:

try:
    raise TypeError(類型錯誤)
except Exception as e:
    print(e)

4. 自定義異常:

class EgonException(BaseException):
    def __init__(self,msg):
        self.msg=msg
    def __str__(self):
        return self.msg

try:
    raise EgonException(類型錯誤)
except EgonException as e:
    print(e)

簡單的總結一下:

什麽是異常,異常就是錯誤引發的結果

什麽是處理,由於異常帶來的是程序崩潰,處理的目的就是讓程序在異常後跳轉到其他邏輯去執行,不讓程序崩潰。

if本身就可以來處理異常,只不過if的方式,對於不同代碼段的同一種異常,需要重復寫多分支的if,而這段多分支if與真正的工作無關,寫多了你的程序可讀性就會及其的差。

try..except的方式,只是python提供給你一種特定的語法結構去做這件事,對於不同代碼的同一種異常,python為你定制了一中類型,一個expect就可以捕捉到。

Python 基礎之 異常處理