python 内存溢出能捕获吗_从0基础学习Python (19)[面向对象开发过程中的异常(捕获异常~相关)]...
從0基礎(chǔ)學(xué)習(xí)Python (Day19)
面向?qū)ο箝_(kāi)發(fā)過(guò)程中的=>異常
什么是異常
? 當(dāng)程序在運(yùn)行過(guò)程中出現(xiàn)的一些錯(cuò)誤,或者語(yǔ)法邏輯出現(xiàn)問(wèn)題,解釋器此時(shí)無(wú)法繼續(xù)正常執(zhí)行了,反而出現(xiàn)了一些錯(cuò)誤的提示,這就是異常(錯(cuò)誤代碼或者BUG)
程序出現(xiàn)異常的后果
? 程序在運(yùn)行過(guò)程中出現(xiàn)了異常
? 輕則功能無(wú)法實(shí)現(xiàn),或者功能運(yùn)行結(jié)果出錯(cuò)
? 重則整個(gè)程序崩潰!!!!!
捕獲異常
? 捕獲異常是在編程中常用的一種處理代碼中可能會(huì)出現(xiàn)漏洞的一些基礎(chǔ)解決方案
捕獲異常的方法
使用try—except語(yǔ)法
try:
#可能會(huì)出現(xiàn)異常的代碼
except:
#如果try里面的哪行代碼出現(xiàn)異常會(huì)直接跳到這里面執(zhí)行代碼
? ·這種捕獲異常存在一個(gè)問(wèn)題,只會(huì)捕獲異常然后執(zhí)行except中的處理代碼,但是無(wú)法得知異常的問(wèn)題
捕獲指定異常
例:
print(a)
#執(zhí)行會(huì)拋異常
#SyntaxError: invalid character in identifier
#在“:”之前叫異常類,之后叫異常信息
語(yǔ)法
try:
#可能會(huì)出現(xiàn)異常的代碼
except 可能出現(xiàn)的異常類型:
#如果捕獲到異常是指定的這個(gè)類型的執(zhí)行代碼
? 在使用捕獲指定異常的時(shí)候一定要考慮所有有可能出現(xiàn)的異常類型,如果出現(xiàn)的異常不在所寫出的“可能出現(xiàn)的異常類”之中,則會(huì)報(bào)錯(cuò)
注意
如果執(zhí)行的代碼的異常類型和要捕獲的異常類型不一致則無(wú)法捕獲異常
一般try下面只放一行嘗試的代碼
捕獲多個(gè)指定異常
? 當(dāng)在捕獲異常的時(shí)候,可以把要捕獲的異常類型的名字,放到except之后,并使用元祖的方式進(jìn)行體現(xiàn),或者采用多個(gè)except之后放上不同的異常類型的名字
異常類
? 異常類是指在Python內(nèi)置的一些類,這些類代表了Python中的一些異常問(wèn)題
異常名稱
描述
BaseException
所有異常的基類
SystemExit
解釋器請(qǐng)求退出
KeyboardInterrupt
用戶中斷執(zhí)行(通常是輸入^C)
Exception
常規(guī)錯(cuò)誤的基類
StopIteration
迭代器沒(méi)有更多的值
GeneratorExit
生成器(generator)發(fā)生異常來(lái)通知退出
SystemExit
Python 解釋器請(qǐng)求退出
StandardError
所有的內(nèi)建標(biāo)準(zhǔn)異常的基類
ArithmeticError
所有數(shù)值計(jì)算錯(cuò)誤的基類
FloatingPointError
浮點(diǎn)計(jì)算錯(cuò)誤
OverflowError
數(shù)值運(yùn)算超出最大限制
ZeroDivisionError
除(或取模)零 (所有數(shù)據(jù)類型)
AssertionError
斷言語(yǔ)句失敗
AttributeError
對(duì)象沒(méi)有這個(gè)屬性
EOFError
沒(méi)有內(nèi)建輸入,到達(dá)EOF 標(biāo)記
EnvironmentError
操作系統(tǒng)錯(cuò)誤的基類
IOError
輸入/輸出操作失敗
OSError
操作系統(tǒng)錯(cuò)誤
WindowsError
系統(tǒng)調(diào)用失敗
ImportError
導(dǎo)入模塊/對(duì)象失敗
KeyboardInterrupt
用戶中斷執(zhí)行(通常是輸入^C)
LookupError
無(wú)效數(shù)據(jù)查詢的基類
IndexError
序列中沒(méi)有沒(méi)有此索引(index)
KeyError
映射中沒(méi)有這個(gè)鍵
MemoryError
內(nèi)存溢出錯(cuò)誤(對(duì)于Python 解釋器不是致命的)
NameError
未聲明/初始化對(duì)象 (沒(méi)有屬性)
UnboundLocalError
訪問(wèn)未初始化的本地變量
ReferenceError
弱引用(Weak reference)試圖訪問(wèn)已經(jīng)垃圾回收了的對(duì)象
RuntimeError
一般的運(yùn)行時(shí)錯(cuò)誤
NotImplementedError
尚未實(shí)現(xiàn)的方法
SyntaxError
Python 語(yǔ)法錯(cuò)誤
IndentationError
縮進(jìn)錯(cuò)誤
TabError
Tab 和空格混用
SystemError
一般的解釋器系統(tǒng)錯(cuò)誤
TypeError
對(duì)類型無(wú)效的操作
ValueError
傳入無(wú)效的參數(shù)
UnicodeError
Unicode 相關(guān)的錯(cuò)誤
UnicodeDecodeError
Unicode 解碼時(shí)的錯(cuò)誤
UnicodeEncodeError
Unicode 編碼時(shí)錯(cuò)誤
UnicodeTranslateError
Unicode 轉(zhuǎn)換時(shí)錯(cuò)誤
Warning
警告的基類
DeprecationWarning
關(guān)于被棄用的特征的警告
FutureWarning
關(guān)于構(gòu)造將來(lái)語(yǔ)義會(huì)有改變的警告
OverflowWarning
舊的關(guān)于自動(dòng)提升為長(zhǎng)整型(long)的警告
PendingDeprecationWarning
關(guān)于特性將會(huì)被廢棄的警告
RuntimeWarning
可疑的運(yùn)行時(shí)行為(runtime behavior)的警告
SyntaxWarning
可疑的語(yǔ)法的警告
UserWarning
用戶代碼生成的警告
捕獲異常描述信息
語(yǔ)法
try:
#可能會(huì)出現(xiàn)異常的代碼
except (指定的異常類型1,指定的異常類型2,...) as 變量:
print(變量)
? 將捕獲的區(qū)域中的代碼出現(xiàn)的指定的異常問(wèn)題的描述信息存放在變量中,然后輸出
捕獲所有異常
? 所有異常類的父類都是Exception類
語(yǔ)法
try:
#可能會(huì)出現(xiàn)異常的代碼
except Exception as 變量:
print(變量)
異常的else
? else表示的是如果沒(méi)有捕獲到異常則需要執(zhí)行的代碼
語(yǔ)法
try:
#可能會(huì)出現(xiàn)異常的代碼
except (可能出現(xiàn)的異常類型1,可能出現(xiàn)的異常類型2)as 變量:
#如果捕獲到異常是指定的這個(gè)類型的執(zhí)行代碼
print(變量)
else:
#如果沒(méi)有捕獲到異常則需要執(zhí)行的代碼
異常的finnally
? finnally表示最終結(jié)果,不論代碼是否捕獲到異常(try中的代碼執(zhí)行之后不管是進(jìn)入了except還是else)最終都要進(jìn)入finnally執(zhí)行
語(yǔ)法
try:
#可能會(huì)出現(xiàn)異常的代碼
except (可能出現(xiàn)的異常類型1,可能出現(xiàn)的異常類型2)as 變量:
#如果捕獲到異常是指定的這個(gè)類型的執(zhí)行代碼
print(變量)
else:
#如果沒(méi)有捕獲到異常則需要執(zhí)行的代碼
finnally:
#不論有無(wú)bug都執(zhí)行這一行
異常的傳遞
? 可以理解為異常的嵌套:
# 計(jì)算1+100
import time
# 程序的時(shí)間線
def fun():
try:
res = 0
print("1"+2)
print(time.time())
# 0.0168831
try:
for i in range(1, 101):
res += i
print(res)
time
time.sleep(2)
except:
print("程序被意外終止1")
except:
print("程序被意外終止2")
finally:
print(time.time())
# 0.0178795
return res
print( fun())
自定義異常
? 在python中一般拋出的異常的語(yǔ)法是異常類對(duì)象,這些異常類對(duì)象是Python提前封裝好的
語(yǔ)法
try:
raise
#用來(lái)引發(fā)異常,讓執(zhí)行except中的語(yǔ)句
except Exception as res:
#捕獲到自定義異常執(zhí)行代碼
else:
#如果沒(méi)有捕獲到異常則需要執(zhí)行的代碼
finnally:
#不論有無(wú)bug都執(zhí)行這一行
? 需求:檢測(cè)一些數(shù)據(jù)例如年齡不能小于0(小于0拋異常)
class AgeInputError(Exception):
def __init__(self, age):
self.age = age
self.minage = 0
def __str__(self):
return f"你輸入的年齡是{self.age},不能小于{self.minage}"
def main():
try:
age = int(input("請(qǐng)輸入年齡:"))
if age < 0:
# raise 關(guān)鍵字是返回一個(gè)異常
raise AgeInputError(age)
except Exception as res:
print(res)
else:
print("年齡無(wú)誤")
finally:
print("注冊(cè)完成")
main()
注意:
? python中的raise關(guān)鍵字用于引發(fā)一個(gè)異常,基本上作用和C#中或Java中的throw關(guān)鍵字相同
Day19-------END
總結(jié)
以上是生活随笔為你收集整理的python 内存溢出能捕获吗_从0基础学习Python (19)[面向对象开发过程中的异常(捕获异常~相关)]...的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: a java runtime envi_
- 下一篇: java backlog满_java s