try except (異常捕獲)
當程序出錯了,但是我們又不想讓用戶看到這個錯誤,而且我在寫程序的時候已經預料到了它可以出現這樣的錯誤,出現這樣的錯誤代表着什么,我們可以提前捕獲這些個錯誤
1、異常處理流程圖:
2、常見異常
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 傳入一個調用者不期望的值,即使值的類型是正確的
|
更多異常:
3、處理單個異常
語法如下:
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
|
4、處理多個異常
①寫多個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'
|
注:第二種寫法的用處:括號里面的所有錯誤,不管出現里面任何一種錯誤都用統一的處理方法。
5、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'
|
6、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
沒有異常
|
7、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語句
|
8、自定義異常
1
2
3
4
5
6
7
|
class
GaoError(Exception):
#定義一個異常類,繼承Exception
def
__init__(
self
,message):
self
.message
=
message
def
__str__(
self
):
return
self
.message
#給對象取一個名
|
觸發自定義異常:
1
2
3
4
5
6
7
|
try
:
raise
GaoError(
"數據庫連接不上了"
)
#觸發自定義異常,GaoError("數據庫連接不上了")這個對象
except
GaoError as e:
print
(e)
#輸出
數據庫連接不上了
|
自定義使用總結:
- 數據庫連接不上的信息
- 權限問題,解析是沒有權限了,給出異常提示
- 業務邏輯的錯誤
斷言
斷言被用作你接下來的程序執行,如果后面程序依賴於前面的程序,后面的程序有很重要,就是后面的程序執行肯定不能出錯,所以在執行之前要做檢查工作。
1、斷言assert
1
2
3
4
5
6
7
8
9
10
11
12
13
|
class
C(
object
):
def
__init__(
self
):
self
.name
=
"AAAAA"
c_obj
=
C()
assert
c_obj.name
=
=
"AAAAA"
#斷言
print
(
"沒有錯誤繼續..."
)
#輸出
沒有錯誤繼續..
|
2、斷言不符合
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
class
C(
object
):
def
__init__(
self
):
self
.name
=
"AAAAA"
c_obj
=
C()
assert
c_obj.name
=
=
"BBBBB"
#斷言出字符串不匹配
print
(
"沒有錯誤繼續..."
)
#輸出
Traceback (most recent call last):
File
"E:/PycharmProjects/pytest/day7/斷言.py"
, line
10
,
in
<module>
assert
c_obj.name
=
=
"BBBBB
AssertionError
#報斷言異常錯誤
|
3、其實也可以使用if解決這個問題,不過相比之下斷言assert更優雅一些,減少代碼量
1
2
3
4
5
6
7
8
9
10
11
|
class
C(
object
):
def
__init__(
self
):
self
.name
=
"zhangqigao"
c_obj
=
C()
if
c_obj.name
=
=
"gaogao"
:
print
(
"有錯誤...."
)
else
:
print
(
"沒有錯誤繼續..."
)
|