Python基礎(19)_異常處理

來源:互聯網
上載者:User

標籤:實現   報錯   斷言   處理機   針對   color   opened   idt   splay   

一、異常處理 錯誤和異常:

1、錯誤的種類:

  1)語法錯誤:這種錯誤,根本過不了python解譯器的文法檢測,必須在程式執行前就改正

  2)邏輯錯誤:

      例如: res1=1/0  、es2=1+‘str‘

2、異常:異常就是程式運行時發生錯誤的訊號,在python中,錯誤觸發的異常如下:

 

Traceback:y追蹤異常的來源

NameError:異常的類型

name ‘aa‘ is not defined: 異常值

3、異常的種類

  在python中不同的異常可以用不同的類型(python中統一了類與類型,類型即類)去標識,不同的類對象標識不同的異常,一個異常標識一種錯誤

常見異常

AttributeError 試圖訪問一個對象沒有的樹形,比如foo.x,但是foo沒有屬性xIOError 輸入/輸出異常;基本上是無法開啟檔案ImportError 無法引入模組或包;基本上是路徑問題或名稱錯誤IndentationError 語法錯誤(的子類) ;代碼沒有正確對齊IndexError 下標索引超出序列邊界,比如當x只有三個元素,卻試圖訪問x[5]KeyError 試圖訪問字典裡不存在的鍵KeyboardInterrupt Ctrl+C被按下NameError 使用一個還未被賦予對象的變數SyntaxError Python代碼非法,代碼不能編譯(個人認為這是語法錯誤,寫錯了)TypeError 傳入物件類型與要求的不符合UnboundLocalError 試圖訪問一個還未被設定的局部變數,基本上是由於另有一個同名的全域變數,導致你以為正在訪問它ValueError 傳入一個調用者不期望的值,即使值的類型是正確的 

 其它異常:

ArithmeticErrorAssertionErrorAttributeErrorBaseExceptionBufferErrorBytesWarningDeprecationWarningEnvironmentErrorEOFErrorExceptionFloatingPointErrorFutureWarningGeneratorExitImportErrorImportWarningIndentationErrorIndexErrorIOErrorKeyboardInterruptKeyErrorLookupErrorMemoryErrorNameErrorNotImplementedErrorOSErrorOverflowErrorPendingDeprecationWarningReferenceErrorRuntimeErrorRuntimeWarningStandardErrorStopIterationSyntaxErrorSyntaxWarningSystemErrorSystemExitTabErrorTypeErrorUnboundLocalErrorUnicodeDecodeErrorUnicodeEncodeErrorUnicodeErrorUnicodeTranslateErrorUnicodeWarningUserWarningValueErrorWarningZeroDivisionError
更多異常

 

異常處理

1、異常處理概念:

  python解譯器檢測到錯誤,觸發異常(也允許程式員自己觸發異常)

  程式員編寫特定的代碼,專門用來捕捉這個異常(這段代碼與程式邏輯無關,與異常處理有關)

  如果捕捉成功則進入另外一個處理分支,執行你為其定製的邏輯,使程式不會崩潰,這就是異常處理

2、為何要進行異常處理:

  python解析器去執行程式,檢測到了一個錯誤時,觸發異常,異常觸發後且沒被處理的情況下,程式就在當前異常處終止,後面的代碼不會運行,誰會去用一個運行著突然就崩潰的軟體。所以你必須提供一種異常處理機制來增強你程式的健壯性與容錯性 

3、如何進行異常處理:

  異常是由程式的錯誤引起的,文法上的錯誤跟異常處理無關,必須在程式運行前就修正

1、使用 if 判斷式

age=input(‘>>: ‘).strip()if age.isdigit():    int(age)

  總結:

1.if判斷式的異常處理只能針對某一段代碼,對於不同的程式碼片段的相同類型的錯誤你需要寫重複的if來進行處理。

2.在你的程式中頻繁的寫與程式本身無關,與異常處理有關的if,就像是在你的代碼中到處打補丁。可讀性極其的差

3.這是可以解決異常的,只是存在1,2的問題,所以,千萬不要妄下定論if不能用來異常處理。如果你不服,那你想想在沒有學習try...except之前,你的程式難道就沒有異常處理,而任由其崩潰麼

 1 def test(): 2     print(‘test running‘) 3 choice_dic={ 4     ‘1‘:test 5 } 6 while True: 7     choice=input(‘>>: ‘).strip() 8     if not choice or choice not in choice_dic:continue #這便是一種異常處理機制啊 9     choice_dic[choice]()10 11 打到你服為止
異常處理舉例

2、python特定文法結構處理

  python為每一種異常定製了一個類型,然後提供了一種特定的文法結構用來進行異常處理

1)基本文法

try:    被檢測的代碼塊except 異常類型:    try中一旦檢測到異常,就執行這個位置的邏輯

2)異常類只能用來處理指定的異常情況,如果非指定異常則無法處理

# 未捕獲到異常,程式直接報錯s1 = ‘hello‘try:    int(s1)except IndexError as e:    print e>>ValueError: invalid literal for int() with base 10: ‘hello‘

3)異常類可以多分支

try:    print(‘===>run‘)    num=input(‘>>: ‘)    int(num)    d={‘a‘:1}    print(‘==dic["b"]=>‘,d[‘b‘])    1/0    l=[]    l[10000]    1+‘2‘    class Foo:        pass    Foo.xexcept ValueError as e1:    print(‘valueerror:‘,e1)except KeyError as e2:    print(‘keyerror:‘,e2)except ZeroDivisionError as e3:    print(‘zero:‘,e3)except IndexError as e4:    print(‘index:‘,e4)except TypeError as e5:    print(‘type:‘,e5)except AttributeError as e6:    print(‘attr: ‘,e6)

4)萬能異常 在python的異常中,有一個萬能異常:Exception,他可以捕獲任意異常,即:

try:    print(‘===>run‘)    num=input(‘>>: ‘)    int(num)    d={‘a‘:1}    print(‘==dic["b"]=>‘,d[‘b‘])    1/0    l=[]    l[10000]    1+‘2‘    class Foo:        pass    Foo.xelse: #沒有異常時才會執行    print(‘try內代碼塊沒有異常則執行我‘) 
finally: #有沒有異常都會執行 print(‘finally‘)

5)raise 主動觸發異常

try:    raise TypeError(‘類型錯誤‘)except Exception as e:    print(e)

6)自訂異常

class EgonException(BaseException):    def __init__(self,msg):        self.msg=msg    def __str__(self):        return self.msgtry:    raise EgonException(‘類型錯誤‘)except EgonException as e:    print(e)

7)斷言

students=[]students.append(‘s1‘)students.append(‘s2‘)assert  len(students) > 10  #斷言條件成立才執行下面代碼    print(‘hhhhh‘)

 

try..except的方式比較if的方式的好處

  try..except這種異常處理機制就是取代if那種方式,讓你的程式在不犧牲可讀性的前提下增強健壯性和容錯性

  異常處理中為每一個異常定製了異常類型(python中統一了類與類型,類型即類),對於同一種異常,一個except就可以捕捉到,可以同時處理多段代碼的異常(無需‘寫多個if判斷式’)減少了代碼,增強了可讀性 

 

使用try..except的方式

1:把錯誤處理和真正的工作分開來
2:代碼更易組織,更清晰,複雜的工作任務更容易實現;
3:毫無疑問,更安全了,不至於由於一些小的疏忽而使程式意外崩潰了

 

什麼時候用異常處理:   try...except應該盡量少用,因為它本身就是你附加給你的程式的一種異常處理的邏輯,與你的主要的工作是沒有關係的 這種東西加的多了,會導致你的代碼可讀性變差而且異常處理本就不是你2b邏輯的擦屁股紙,只有在有些異常無法預知的情況下,才應該加上try...except,其他的邏輯錯誤應該盡量修正

 

Python基礎(19)_異常處理

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.