Python異常原理及異常捕捉實現過程解析
關于選課程序,最近著實有點忙,沒機會復習os、pickle兩部分模塊,所以數據儲存和字典讀取成為了一個問題,大致原理知道,但是具體操作可能還是得返回去再好好看看,所以目前就提前開始學習新的知識了,雖然今天感覺str的相關方法忘的是干干凈凈的,但是我有pycharm。
今天主要內容是關于異常,其實有點想最開始剛學的感覺,比較簡單。
異常就是程序運行時發生錯誤的信號(在程序出現錯誤時,則會產生一個異常,若程序沒有處理它,則會拋出該異常,程序的運行也隨之終止),在python中,錯誤觸發的異常如下:
錯誤被分為了兩種:
1.語法錯誤,基本pycharm都會幫你顯示出來,不該犯的
2.邏輯錯誤,不太容易看出來,pycharm也不管,只有Python解釋器是真愛,但是也得等到真的運行的時候
#TypeError:int類型不可迭代for i in 3: pass#ValueErrornum=input('>>: ') #輸入helloint(num)#NameErroraaa#IndexErrorl=[’egon’,’aa’]l[3]#KeyErrordic={’name’:’egon’}dic[’age’]#AttributeErrorclass Foo:passFoo.x#ZeroDivisionError:無法完成計算res1=1/0res2=1+’str’
下面是今天最為重要的部分:
在python中不同的異常可以用不同的類型(python中統一了類與類型,類型即類)去標識,一個異常標識一種錯誤
AttributeError 試圖訪問一個對象沒有的樹形,比如foo.x,但是foo沒有屬性xIOError 輸入/輸出異常;基本上是無法打開文件ImportError 無法引入模塊或包;基本上是路徑問題或名稱錯誤IndentationError 語法錯誤(的子類) ;代碼沒有正確對齊IndexError 下標索引超出序列邊界,比如當x只有三個元素,卻試圖訪問x[5]KeyError 試圖訪問字典里不存在的鍵KeyboardInterrupt Ctrl+C被按下NameError 使用一個還未被賦予對象的變量SyntaxError Python代碼非法,代碼不能編譯(個人認為這是語法錯誤,寫錯了)TypeError 傳入對象類型與要求的不符合UnboundLocalError 試圖訪問一個還未被設置的局部變量,基本上是由于另有一個同名的全局變量,導致你以為正在訪問它ValueError 傳入一個調用者不期望的值,即使值的類型是正確的
更多異常(有空還是要挨個錯一遍):
ArithmeticErrorAssertionErrorAttributeErrorBaseExceptionBufferErrorBytesWarningDeprecationWarningEnvironmentErrorEOFErrorExceptionFloatingPointErrorFutureWarningGeneratorExitImportErrorImportWarningIndentationErrorIndexErrorIOErrorKeyboardInterruptKeyErrorLookupErrorMemoryErrorNameErrorNotImplementedErrorOSErrorOverflowErrorPendingDeprecationWarningReferenceErrorRuntimeErrorRuntimeWarningStandardErrorStopIterationSyntaxErrorSyntaxWarningSystemErrorSystemExitTabErrorTypeErrorUnboundLocalErrorUnicodeDecodeErrorUnicodeEncodeErrorUnicodeErrorUnicodeTranslateErrorUnicodeWarningUserWarningValueErrorWarningZeroDivisionError
為了保證程序的健壯性與容錯性,即在遇到錯誤時程序不會崩潰,我們需要對異常進行處理,
如果錯誤發生的條件是可預知的,我們需要用if進行處理:在錯誤發生之前進行預防
之前也是有操作過的:
AGE=10while True: age=input(’>>: ’).strip() if age.isdigit(): #只有在age為字符串形式的整數時,下列代碼才不會出錯,該條件是可預知的 age=int(age) if age == AGE: print(’you got it’) break
如果錯誤發生的條件是不可預知的,則需要用到try...except:在錯誤發生之后進行處理
#基本語法為try: 被檢測的代碼塊except 異常類型: try中一旦檢測到異常,就執行這個位置的邏輯#舉例try: f=open(’a.txt’) g=(line.strip() for line in f) print(next(g)) print(next(g)) print(next(g)) print(next(g)) print(next(g))except StopIteration: f.close()
#1 異常類只能用來處理指定的異常情況,如果非指定異常則無法處理。s1 = ’hello’try: int(s1)except IndexError as e: # 未捕獲到異常,程序直接報錯 print e#2 多分支s1 = ’hello’try: int(s1)except IndexError as e: print(e)except KeyError as e: print(e)except ValueError as e: print(e)#3 萬能異常Exceptions1 = ’hello’try: int(s1)except Exception as e: print(e)#4 多分支異常與萬能異常#4.1 如果你想要的效果是,無論出現什么異常,我們統一丟棄,或者使用同一段代碼邏輯去處理他們,那么騷年,大膽的去做吧,只有一個Exception就足夠了。#4.2 如果你想要的效果是,對于不同的異常我們需要定制不同的處理邏輯,那就需要用到多分支了。#5 也可以在多分支后來一個Exceptions1 = ’hello’try: int(s1)except IndexError as e: print(e)except KeyError as e: print(e)except ValueError as e: print(e)except Exception as e: print(e)#6 異常的其他機構s1 = ’hello’try: int(s1)except IndexError as e: print(e)except KeyError as e: print(e)except ValueError as e: print(e)#except Exception as e:# print(e)else: print(’try內代碼塊沒有異常則執行我’)finally: print(’無論異常與否,都會執行該模塊,通常是進行清理工作’)#7 主動觸發異常try: raise TypeError(’類型錯誤’)except Exception as e: print(e)#8 自定義異常class EgonException(BaseException): def __init__(self,msg): self.msg=msg def __str__(self): return self.msgtry: raise EgonException(’類型錯誤’)except EgonException as e: print(e)#9 斷言:assert 條件assert 1 == 1 assert 1 == 2#10 總結try..except
異常捕捉的優勢:
1:把錯誤處理和真正的工作分開來
2:代碼更易組織,更清晰,復雜的工作任務更容易實現;
3:毫無疑問,更安全了,不至于由于一些小的疏忽而使程序意外崩潰了;
主要是理論知識,后期使用才是關鍵,就像我要復習的pickle和os模塊一樣,就是這些了。
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持好吧啦網。
相關文章:
