python中的異常處理相關語句和叠代器
異常(基礎) exception
什麽是錯誤
錯誤是指由於邏輯或語法等導致一個程序無法正常執行的問題
什麽是異常
異常是程序出錯時標識的一種狀態
當異常發生時,程序不會再向下執行,而轉去調用此函數的地方待處理此錯誤並恢復為正常狀態
作用:
用作信號,通知上層調用者有錯誤產生需要處理
try語句:
兩種語法:
try- except
try --finally 語句
try-except語句
語法:
try:
可能觸發異常的語句
except 錯誤類型1 [as 變量名1]:
異常處理語句1
except 錯誤類型2 [as 變量名2]:
異常處理語句2
except (錯誤類型3,錯誤類型4) [as 變量3]:
異常處理語句3
except:
異常處理語句other
else:
未發生異常語句
finally:
最終語句
作用:
嘗試捕獲異常通知,將程序由異常流程轉為正常流程並繼續執行
說明:
except子句可以有一個或多個,但至少一個
示例I;
練習:
寫一個函數,get_score()來獲取學生輸入的成績(0~100)的數,如果用戶輸入的不是0~100的整數則返回0,
否則返回輸入的整數
def get_score():
try:
x=input(‘請輸入一個數‘)
except:
print(‘unexpect int‘)
else:
if 0<=x<=100:
return 0
else:
return x
get_score()
try-finally 語句
語法:
try:
可能觸發異常的語句
finally:
最終語句
說明:
finally子句不可以省略
一定不會存在except子句
作用:
通常用try-finally語句來做觸發異常時必須要處理的事情,無論異常是否發生,finally子句都會被執行
try-finally 語句不會改變程序的(正常/異常狀態)
def fry_egg():
print(‘打開天然氣...‘)
try:
count=int(input(‘請輸入雞蛋個數:‘))
print(‘完成煎蛋,總煎%d個雞蛋‘%count)
finally:
print(‘關閉天然氣‘)
try:
fry_egg()
except SyntaxError:
print(‘煎雞蛋時,發生異常,已轉為正常‘)
raise 語句:
作用:
觸發一個錯誤,讓程序進入異常狀態
發送錯誤通知給調用者
語法:
raise 異常類型
或
raise 異常對象
或
raise # 重新觸發上一次異常
示例見:raise.py
raise2.py
# def make_exercise():
# print(‘函數開始‘)
# raise ZeroDivisionError
# print(‘函數結束‘)
# # make_exercise()
# print(‘程序結束‘)
# try:
# make_exercise()
# except ZeroDivisionError:
# print(‘接受到make_ex發出的錯誤通知‘)
# print(‘程序正常結束‘)
def make_exercise():
print(‘函數開始‘)
# raise ZeroDivisionError
e=ValueError(‘值錯誤‘) #創建一個錯誤對象
raise e
print(‘函數結束‘)
# make_exercise()
print(‘程序結束‘)
try:
make_exercise()
except ZeroDivisionError:
print(‘接受到make_ex發出的錯誤通知‘)
except ValueError as err:
print(‘valueerror--->‘,err)
print(‘程序正常結束‘)
#此示例示意raise無參的用法
def fa():
print(‘----fa----開始‘)
raise ValueError(‘故意制造一個錯誤!‘)
print(‘----fa----結束‘)
def fb():
print(‘fb開始‘)
try:
fa()
except ValueError as err:
print(‘fa裏發生了值錯誤已處理‘)
raise
#此處如果要將err 再次向上傳遞
print(‘fb結束‘)
try:
fb()
except ValueError:
raise
print(‘再一次收到fb內部發生的錯誤‘)
練習1
寫一個函數get_age()用來獲取一個人的年齡信息此函數規定用戶只能輸入1~140之間的整數,如果用戶輸入得數是其他
的數值,則直接觸發valueError類型錯誤!
如:
def get_age():
x=int(input(‘請輸入您的年齡,範圍(1~140)‘))
# if x not in range(1,140):
# raise ValueError(‘類型錯誤‘)
if x<1:
raise ValueError(‘您的年齡太小‘)
if x>140:
raise ValueError(‘您的年齡太大‘)
return x
try:
age=get_age()
print(‘用戶輸入的年齡是‘,age)
except ValueError as err:
# raise
print(‘用戶輸入的不是140以內的數字,獲取年齡失敗‘)
print(‘err=‘,err)
aseert 語句
語法:
assert 真值表達式,錯誤數據(通常是字符串)
作用:
當真值表達式為false時,用錯誤數據創建一個AssertionError類型錯誤,並進入異常狀態
等同於:
if bool(真值表達式)==False:
raise AssertionError(錯誤數據)
示例見:
assert.py
def get_score():
s=int(input(‘請輸入學生成績:(0~100)‘))
assert 0<=s<=100 ,"成績超出範圍"
#if bool(0<=s<=100):
# raise AssertionError("成績超出範圍")
return s
try:
score=get_score()
print(‘學生的成績為:‘,score)
except AssertionError as err:
print(‘AssertionError類型的錯誤被觸發,且已捕獲‘)
print(‘err=‘,err)
小結:
異常處理相關的語句
try-except
作用:捕獲異常通知,將程序有異常狀態轉為正常狀態
try-finally
作用:執行必須要執行的語句
raise
作用:觸發異常(拋出異常),讓程序進入異常流程
assert
作用:根據條件來觸發AssertionError類的異常並進入異常流程
叠代器 Iterator
什麽是叠代器
叠代器是訪問可叠代對象的工具
叠代器是指用iter(obj)函數返回的對象(實例)
叠代器可以用next(it)函數獲取可叠代對象的數據
叠代器函數:
iter(iterable)從可叠代對象中返回一個叠代器,iterable必須是能提供一個叠代器的對象
next(iteerable)從叠代器iterable中獲取下一個記錄,如果無法獲取下一條記錄,則觸發
StopIteration異常通知
說明:
叠代器只能往前取值,不會後退
示例:
l=[1,2,3,4]
it=iter(l)
print(next(it))
示例:#用叠代器和while來代替for循環
iterator.py
練習:
有一個集合:
s={‘唐僧‘,‘悟空‘,‘白潔‘,‘沙僧‘}
用for進行遍歷
s={‘唐僧‘,‘悟空‘,‘白潔‘,‘沙僧‘}
it=iter(s)
while True:
try:
print(next(it))
except StopIteration:
print(‘Bianlijieshu‘)
break
python中的異常處理相關語句和叠代器