面向物件【day08】:異常處理(六)
阿新 • • 發佈:2018-11-02
本節內容
1、概述
2、異常梳理
3、異常梳理流程圖
4、異常大全
5、自定義異常
一、概述
異常處理是當程式出錯了,但是我們又不想讓使用者看到這個錯誤,而且我在寫程式的時候已經預料到了它可以出現這樣的錯誤,出現這樣的錯誤代表著什麼,我們可以提前處理這些個錯誤
二、異常處理
2.1 處理單個異常
語法如下:
1 2 3 4 |
try :
code
#處理的語句
except
Error1 as e:
#遇到Error1執行下面的語句,在python2中寫成except Error1,e
print (e)
|
程式碼如下:
1 2 3 4 5 6 7 8 |
name =
[
1
,
2
,
3
]
try
:
name[
3
]
#不存在3這個下標值
except
IndexError as e:
#抓取 IndexError 這個異常
print
(e)
#e是錯誤的詳細資訊
#輸出
list
index out of
range
|
2.2 處理多個異常
①寫多個except,語法如下:
1 2 3 4 5 6 |
try
:
code
except
Error1 as e:
#處理Error1異常
print
(e)
except
Error2 as e:
#處理Error2異常
print
(e)
|
程式碼如下:
1 2 3 4 5 6 7 8 9 10 11 12 |
name
=
[
1
,
2
,
3
]
data
=
{
"a"
:
"b"
}
try
:
data[
"c"
]
#這邊已經出現異常KeyError ,所以直接跳出code,跳到KeyError 下去處理
name[
3
]
except
IndexError as e:
print
(e)
except
KeyError as e:
print
(e)
#輸出
'c'
|
②寫1個except,語法如下:
1 2 3 4 |
try
:
code
except
(Error1,Error2,...) as e:
print
(e)
|
程式碼如下:
1 2 3 4 5 6 7 8 |
try
:
data[
"c"
]
name[
3
]
except
(IndexError,KeyError) as e:
print
(e)
#輸出
'c'
|
注:第二種寫法的用處:括號裡面的所有錯誤,不管出現裡面任何一種錯誤都用統一的處理方法。
2.3 Exception異常
語法如下:
1 2 3 4 5 6 |
try
:
code
except
(Error1,Error2,...) as e:
print
(e)
except
Exception as e:
#用Exception表示一下子抓住所有異常,這個一般情況下建議在異常最後面用,用在最後抓未知的異常
print
(e)
|
程式碼如下:
1 2 3 4 5 6 7 8 9 |
try
:
open
(
"qigao.text"
,
"r"
,encoding
=
"utf-8"
)
except
(IndexError,KeyError) as e:
#沒有IndexError,KeyError這兩個異常
print
(e)
except
Exception as e:
#只能通過這個異常處理,Exception 抓住所有的異常
print
(e)
#輸出
[Errno
2
] No such
file
or
directory:
'qigao.text'
|
2.4 else作用
作用:沒有異常,則走else部分的邏輯程式碼
1 2 3 4 5 6 7 8 9 10 11 12 |
try
:
print
(
"qigao,handson"
)
#程式碼沒有異常
except
(IndexError,KeyError) as e:
print
(e)
except
Exception as e:
print
(e)
else
:
#沒有異常出錯,走else的邏輯程式碼
print
(
"沒有異常"
)
#輸出
qigao,handson
沒有異常
|
2.4 finnally作用
作用:不管有沒有錯誤,都會執行finnally中的程式碼
語法如下:
1 2 3 4 5 6 7 8 9 10 |
try
:
code
except
(Error1,Error2,...) as e:
print
(e)
except
Exception as e:
print
(e)
else
:
print
(
"沒有錯誤,執行"
)
finnally:
print
(
"不管有沒有錯,都執行finnally"
)
|
①沒有異常情況
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
try
:
print
(
"qigao,handson"
)
#沒有異常
except
(IndexError,KeyError) as e:
print
(e)
except
Exception as e:
print
(e)
else
:
print
(
"沒有異常"
)
finally
:
print
(
"不管有沒有錯,都這行finnally"
)
#輸出
qigao,handson
沒有異常
不管有沒有錯,都這行finnally
#沒有報錯,執行finnally
|
②出現異常情況
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
try
:
data
=
{
"a"
:
"b"
}
data[
"c"
]
#data字典中沒有'c'這個key值
except
(IndexError,KeyError) as e:
print
(e)
except
Exception as e:
print
(e)
else
:
print
(
"沒有異常"
)
finally
:
print
(
"不管有沒有錯,都這行finnally"
)
#輸出
'c'
不管有沒有錯,都這行finnally
#出錯了也執行了finnally語句
|
三、異常處理流程圖
四、異常大全
4.1 常用異常
1 2 3 4 5 6 7 8 9 10 11 12 13 |
AttributeError 試圖訪問一個物件沒有的樹形,比如foo.x,但是foo沒有屬性x
IOError 輸入
/
輸出異常;基本上是無法開啟檔案
ImportError 無法引入模組或包;基本上是路徑問題或名稱錯誤
IndentationError 語法錯誤(的子類) ;程式碼沒有正確對齊
IndexError 下標索引超出序列邊界,比如當x只有三個元素,卻試圖訪問x[
5
]
KeyError 試圖訪問字典裡不存在的鍵
KeyboardInterrupt Ctrl
+
C被按下
NameError 使用一個還未被賦予物件的變數
SyntaxError Python程式碼非法,程式碼不能編譯(個人認為這是語法錯誤,寫錯了)
TypeError 傳入物件型別與要求的不符合
UnboundLocalError 試圖訪問一個還未被設定的區域性變數,基本上是由於另有一個同名的全域性變數,
導致你以為正在訪問它
ValueError 傳入一個呼叫者不期望的值,即使值的型別是正確的
|
4.2 更多異常
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
4.3 ValueError
1 2 3 4 5 |
s1
=
'hello'
try
:
int
(s1)
except
ValueError, e:
#python2.7的寫法
print
e
|
五、自定義異常
5.1 自定義異常
1 2 3 4 5 6 7 |
class
GaoError(Exception):
#定義一個異常類,繼承Exception
def
__init__(
self
,message):
self
.message
=
message
def
__str__(
self
):
return
self
.message
#給物件取一個名字
|
5.2 觸發自定義異常
1 2 3 4 5 6 7 |
try
:
raise
GaoError(
"資料庫連線不上了"
)
#觸發自定義異常,GaoError("資料庫連線不上了")這個物件
except
GaoError as e:
print
(e)
#輸出
資料庫連線不上了
|
自定義使用總結:
- 資料庫連線不上的資訊
- 許可權問題,解析是沒有許可權了,給出異常提示
- 業務邏輯的錯誤