python异常处理优点_python各类异常处理学习笔记
print("============異常與工具===================")
print("============一、異?;A(chǔ)===================")
"""
1、try/except
捕捉由 Python或你引起的異常并恢復(fù)。
2、try/finally
無論異常是否發(fā)生,執(zhí)行清理行為。
3、raise
手動在代碼中觸發(fā)異常。
4、assert
有條件地在程序代碼中觸發(fā)異常。
5、with/as
在 Python2.6和后續(xù)版本中實(shí)現(xiàn)環(huán)境管理器(在2.5版中是可選功能)。
"""
def fetcher(obj,index):
return obj[index]
x='spam'
print(fetcher(x,3))
# try:
# fetcher(x,4)
# except IndexError:
# print('got exception')
def catcher():
try:
fetcher(x,4)
except IndexError:
print('got exception')
print('continuing')
catcher()
print("============1、用戶異常的定義===================")
class Bad(Exception):
pass
def doomed():
raise Bad()
try:
doomed()
except Bad:
print('got Bad')
print("============2、終止行為===================")
try:
fetcher(x,3)
finally:
print('after fetch')
def after():
try:
fetcher(x,3)
finally:
print('after fetch')
print('after try?')
after()
with open('lumberjack.txt','w') as file:
file.write('The larch!\n')
"""
本章習(xí)題
1.說出異常處理的3個(gè)優(yōu)點(diǎn)。
2.如果你不想做任何特殊的事情來處理異常,那么異常會發(fā)生什么呢?
3.如何從一個(gè)異?;謴?fù)你的腳本?
4.說出在腳本中觸發(fā)異常的兩種方式。
5.指出兩種方式:不管異常是否發(fā)生,它們用來指定最終運(yùn)行的行為。
"""
"""
1.異常處理對于錯(cuò)誤處理、終止動作和事件通知有用。它可以簡化特殊情況的處理,并且可以用來實(shí)現(xiàn)替代的控制流程。一般來講,異常處理還可以減少程序所需的檢
測錯(cuò)誤代碼的數(shù)量,因?yàn)樗械腻e(cuò)誤都由處理器來過濾,你可能不需要測試每個(gè)操作的輸出。
2.任何未捕獲的異常最終都流入默認(rèn)的異常處理器, Python在程序的最頂端提供了它。這個(gè)處理器打印出類似的出錯(cuò)消息,并且退出程序。
3.如果你不想要默認(rèn)消息和退出,可以編寫ry/except語句來捕獲并從觸發(fā)的異?;謴?fù)。一旦捕獲了一個(gè)異常,該異常將終止,并且程序繼續(xù)。
4. raiseassert和語句可以用來觸發(fā)一個(gè)異常,就好像該異常已經(jīng)由 Python自身引
發(fā)。原則上講,我們可以通過生成一個(gè)程序錯(cuò)誤來引發(fā)異常,但是,這通常不是一個(gè)明確的目標(biāo)。
5.try y/finally語句可以用來確保在一個(gè)代碼塊退出后執(zhí)行的操作,而不管它是否會引
發(fā)一個(gè)異常。with/as語句也可以用來確保要運(yùn)行的終止操作,但是,只有當(dāng)處理的對象類型支持它的時(shí)候才可用。
"""
print("============二、異常編碼細(xì)節(jié)===================")
"""
try:
#Run this main action first
except :
#Run if name1 is raised during try block
except(name2, name3):
#Run if any of these exceptions occur
except as :
#Run if name4 is raised, and get instance raised
except:
#Run for allother) exceptions raised
else:
#Run if no exception was raised during try block
except分句會捕捉異常, finally分句最后一定會執(zhí)行,而如果沒遇上異常,else分句就會執(zhí)行。
"""
"""
try語句分句形式
分句形式 說明
except: 捕捉所有(其他)異常類型
except name: 只捕捉特定的異常
except name, value: 捕捉所列的異常和其額外的數(shù)據(jù)(或?qū)嵗?
except(name1, name2): 捕捉任何列出的異常
except(name1,name2), value:捕捉任何列出的異常,并取得其額外數(shù)據(jù)
else: 如果沒有引發(fā)異常,就運(yùn)行
finally: 總是會運(yùn)行此代碼塊
"""
# class MyError(Exception):pass
# def stuff(file):
# raise MyError()
# file= open('data','w')
# try:
# stuff(file)
# finally:
# file.close()
# print('not reached')
print("============三、統(tǒng)一try/exception/finally語句===================")
# try:
# main-action
# except Exception1:
# handler1
# except Exception1:
# handler2
# ...
# else:
# else-block
# finally:
# finally-block
"""
try --- except --- else --- finally
"""
print("============四、合并Try的例子===================")
sep = '-'*32+'\n'
print(sep+'Exception Raise And Caught')
try:
x='spam'[99]
except IndexError:
print('except run')
finally:
print('finally run')
print('after run')
print(sep + 'No Exception Raise')
try:
x='spam'[3]
except IndexError:
print('except run')
finally:
print('finally run')
print('after run')
print(sep + 'No Exception,With Else')
try:
x='spam'[3]
except IndexError:
print('except run')
else:
print('else run')
finally:
print('finally run')
print('after run')
print(sep + 'Exception Raise But Not Caught')
try:
x=1 / 0
except ZeroDivisionError:
print('except run')
finally:
print('finally run')
print('after run')
print("============五、環(huán)境管理協(xié)議===================")
# class TraceBlock:
# def message(self,arg):
# print('running',arg)
# def __enter__(self):
# print('starting with block')
# return self
# def __exit__(self, exc_type, exc_val, exc_tb):
# if exc_type is None:
# print('exited nomally\n')
# else:
# print('raise an exception!',exc_type)
# return False
# with TraceBlock() as action:
# action.message('test 1')
# print('reached')
#
# with TraceBlock() as action:
# action.message('test 2')
# raise TypeError
# print('not reached')
print("============二、異常對象===================")
"""
使用 raise語句主動拋出異常的意思是開發(fā)者可以自己制造程序異常,這里的程序異常不是指發(fā)生了內(nèi)存溢出、列表越界訪問等系統(tǒng)異常,而是指程序在執(zhí)行過程中,發(fā)生
了用戶輸入的數(shù)據(jù)與要求數(shù)據(jù)不符、用戶操作錯(cuò)誤等問題,這些問題都需要程序進(jìn)行處理并給出相應(yīng)的提示。處理這些問題多使用判斷語句,在判斷語句體內(nèi)進(jìn)行相應(yīng)的
問題處理,如果處理問題的語句過多,就會導(dǎo)致代碼復(fù)雜化,代碼結(jié)構(gòu)不夠清晰。在這種情況下,可以使用 raise語句主動拋出異常,由異常處理語句塊進(jìn)行處理。
"""
#用戶登錄判斷,登錄窗口設(shè)置
try:
print("請輸入登錄賬號:")
username= input(">>:")
if username !="John":
raise Exception("用戶名輸入錯(cuò)誤,請重新輸入:")
print("請輸入登錄密碼:")
psw= input(">>:")
if(psw !="123456"):
raise Exception("密碼輸入錯(cuò)誤,請重新輸入")
except Exception as e:
print(e)
print("============三、為什么使用類異常===================")
# class General(Exception):pass
# class Specific1(General):pass
# class Specific2(General):pass
#
# try:
# func()
# except(General,Specific1,Specific2):
# ...
"""
1、BaseException 異常的頂級根類
2、Exception 與應(yīng)用相關(guān)的異常的頂層根超類,這是BaseException的一個(gè)直接子類,并且是所有其他內(nèi)置異常的超類,除了系統(tǒng)退出事件類之外(SystemExit、
KeyboardInterruptGeneratorExit和)幾乎所有的用戶定義的類都應(yīng)該繼承自這個(gè)類,而不是BaseException。當(dāng)遵從這一慣例的時(shí)候,在一條try語句的處理
器中指明 Exception,會確保你的程序?qū)⒉东@除了系統(tǒng)退出事件之外的所有異常,通常該事件是允許通過的。實(shí)際上, Exception變成了try語句中的一個(gè)全捕獲,
并且比一條空的 except更精確。
3、ArithmeticError:所有數(shù)值錯(cuò)誤的超類(并且是Exception的一個(gè)子類)。
4、OverflowError:識別特定的數(shù)值錯(cuò)誤的子類。
"""
# class FormatError(Exception):
# logfile = 'fomaterror.txt'
# def __init__(self,line,file):
# self.line = line
# self.file = file
# def logerror(self):
# log = open(self.logfile,'a')
# print('Error at',self.file,self.line,file=log)
# def parser():
# raise FormatError(40,'spam.txt')
# try:
# parser()
# except FormatError as exc:
# exc.logerror()
def action2():
print(1+[])
def action1():
try:
action2()
except TypeError:
print('inner try')
try:
action1()
except TypeError:
print('outer try')
print("============四、語法嵌套化==================")
try:
try:
action2()
except TypeError:
print('inner try')
except TypeError:
print('outer try')
總結(jié)
以上是生活随笔為你收集整理的python异常处理优点_python各类异常处理学习笔记的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android ToolBar 使用完全
- 下一篇: dict取值_Python基础数据类型「