python异常处理优点_python各类异常处理学习笔记
print("============異常與工具===================")
print("============一、異?;A===================")
"""
1、try/except
捕捉由 Python或你引起的異常并恢復。
2、try/finally
無論異常是否發生,執行清理行為。
3、raise
手動在代碼中觸發異常。
4、assert
有條件地在程序代碼中觸發異常。
5、with/as
在 Python2.6和后續版本中實現環境管理器(在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')
"""
本章習題
1.說出異常處理的3個優點。
2.如果你不想做任何特殊的事情來處理異常,那么異常會發生什么呢?
3.如何從一個異常恢復你的腳本?
4.說出在腳本中觸發異常的兩種方式。
5.指出兩種方式:不管異常是否發生,它們用來指定最終運行的行為。
"""
"""
1.異常處理對于錯誤處理、終止動作和事件通知有用。它可以簡化特殊情況的處理,并且可以用來實現替代的控制流程。一般來講,異常處理還可以減少程序所需的檢
測錯誤代碼的數量,因為所有的錯誤都由處理器來過濾,你可能不需要測試每個操作的輸出。
2.任何未捕獲的異常最終都流入默認的異常處理器, Python在程序的最頂端提供了它。這個處理器打印出類似的出錯消息,并且退出程序。
3.如果你不想要默認消息和退出,可以編寫ry/except語句來捕獲并從觸發的異?;謴?。一旦捕獲了一個異常,該異常將終止,并且程序繼續。
4. raiseassert和語句可以用來觸發一個異常,就好像該異常已經由 Python自身引
發。原則上講,我們可以通過生成一個程序錯誤來引發異常,但是,這通常不是一個明確的目標。
5.try y/finally語句可以用來確保在一個代碼塊退出后執行的操作,而不管它是否會引
發一個異常。with/as語句也可以用來確保要運行的終止操作,但是,只有當處理的對象類型支持它的時候才可用。
"""
print("============二、異常編碼細節===================")
"""
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分句最后一定會執行,而如果沒遇上異常,else分句就會執行。
"""
"""
try語句分句形式
分句形式 說明
except: 捕捉所有(其他)異常類型
except name: 只捕捉特定的異常
except name, value: 捕捉所列的異常和其額外的數據(或實例)
except(name1, name2): 捕捉任何列出的異常
except(name1,name2), value:捕捉任何列出的異常,并取得其額外數據
else: 如果沒有引發異常,就運行
finally: 總是會運行此代碼塊
"""
# class MyError(Exception):pass
# def stuff(file):
# raise MyError()
# file= open('data','w')
# try:
# stuff(file)
# finally:
# file.close()
# print('not reached')
print("============三、統一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("============五、環境管理協議===================")
# 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語句主動拋出異常的意思是開發者可以自己制造程序異常,這里的程序異常不是指發生了內存溢出、列表越界訪問等系統異常,而是指程序在執行過程中,發生
了用戶輸入的數據與要求數據不符、用戶操作錯誤等問題,這些問題都需要程序進行處理并給出相應的提示。處理這些問題多使用判斷語句,在判斷語句體內進行相應的
問題處理,如果處理問題的語句過多,就會導致代碼復雜化,代碼結構不夠清晰。在這種情況下,可以使用 raise語句主動拋出異常,由異常處理語句塊進行處理。
"""
#用戶登錄判斷,登錄窗口設置
try:
print("請輸入登錄賬號:")
username= input(">>:")
if username !="John":
raise Exception("用戶名輸入錯誤,請重新輸入:")
print("請輸入登錄密碼:")
psw= input(">>:")
if(psw !="123456"):
raise Exception("密碼輸入錯誤,請重新輸入")
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 與應用相關的異常的頂層根超類,這是BaseException的一個直接子類,并且是所有其他內置異常的超類,除了系統退出事件類之外(SystemExit、
KeyboardInterruptGeneratorExit和)幾乎所有的用戶定義的類都應該繼承自這個類,而不是BaseException。當遵從這一慣例的時候,在一條try語句的處理
器中指明 Exception,會確保你的程序將捕獲除了系統退出事件之外的所有異常,通常該事件是允許通過的。實際上, Exception變成了try語句中的一個全捕獲,
并且比一條空的 except更精確。
3、ArithmeticError:所有數值錯誤的超類(并且是Exception的一個子類)。
4、OverflowError:識別特定的數值錯誤的子類。
"""
# 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')
總結
以上是生活随笔為你收集整理的python异常处理优点_python各类异常处理学习笔记的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android ToolBar 使用完全
- 下一篇: dict取值_Python基础数据类型「