python异常处理_Python入门 断言与异常处理
一、斷言
斷言,可以理解為判斷是否斷開的預言。
assert 表達式 , 描述表達式為我們的預期結果,當表達式的結果為False時,拋出 AssertionError 異常,如無異常捕獲程序遇到異常時直接結束運行。反之,表達式結果為True 程序繼續向下運行。
我們何時使用斷言?
斷言需要慎用,尤其是寫測試用例或者程序時,因為我們運行程序時,如果斷言失敗,無異常捕獲程序則會結束運行,導致后面的代碼無法執行。
斷言一般用在防御型的編程、運行時檢查程序邏輯、檢查約定、程序常量、檢查文檔時,在從來不會運行失敗的代碼不必要加上斷言。
示例1.1:當pi值對修改拋出異常
class輸出結果:
Traceback (most recent call last):assert self.pi == Circle.pi, 'pi 值被修改' AssertionError: pi 值被修改示例1.2:
assert二、語法錯誤與異常的區別
語法錯誤:或者稱之為解析錯,程序無法解析或者編譯
1、語法錯誤:代碼不符合解釋器或編譯器的語法,如:print()輸出單詞出錯
2、邏輯錯誤:不完成或者不合法的輸入或者計算機出問題,如:死循環
異常:執行過程中出現問題導致程序無法執行
1、程序遇到邏輯或者算法問題,如:1/0
2、運行過程中計算機錯誤,如:內存不夠或者IO錯誤
異常出現的過程:
1、異常產生,檢查到錯誤且解釋器認為是異常,拋出異常
2、異常處理,截獲異常,忽略或者終止程序處理異常
總結:異常都可以是錯誤,但是錯誤不一定是異常
三、異常
運行期間檢測到的錯誤被稱為異常,大多數的異常都不會被程序處理,都以錯誤信息的形式展現。
如下:
>>>1/0 Traceback (most recent call last):File "<input>", line 1, in <module> ZeroDivisionError: division by zero >>>4+a*5 Traceback (most recent call last):File "<input>", line 1, in <module> NameError: name 'a' is not defined >>>'2'+2 Traceback (most recent call last):File "<input>", line 1, in <module> TypeError: Can't convert 'int' object to str implicitly異常以不同的類型出現,這些類型都作為信息的一部分打印出來。如上面例子中的類型有ZeroDivisionError,NameError 和 TypeError異常。
錯誤信息的前面部分顯示了異常發生的上下文,并以調用棧的形式顯示具體信息。
Python中常見的異常
常見異常四、異常處理 try...except...else...finally...
怎么捕獲異常,并處理?
我們捕獲異常使用 try ... except ...,try 與 except 之間是可能會發生異常的語句塊,而 except 下的語句塊是當異常發生后我們進行處理的語句塊。
示例 4.1:
while運行程序:
接收一個除數:1 2.0 接收一個除數:0 發生了異常 接收一個除數:2a 發生了異常如上,當我們輸入0發生了異常,輸入2a也發生了異常,因為int()無法將2a轉換為int,而且兩種異常類類型不同。
怎么捕獲特定的異常?
在 except 后加入異常類型,就可以捕獲特定的異常,也可以一次性捕獲多個異常,如下示例4.2
示例4.2:
while運行程序:
接收一個除數:0 發生了ZeroDivisionError異常 接收一個除數:a 發生了ValueError或KeyboardInterrupt或TypeError異常except 后語句只在發生異常后才執行,那么有沒有當異常沒有發生時我們才進行處理的語句?
有,try ... except ... else ...,else 后的語句塊是當異常沒有發生后才會執行。
示例4.3:
while運行程序:
接收一個除數:0 發生了ZeroDivisionError異常 接收一個除數:1 2.0 結束程序運行如上運行結果,else只有在沒有發生異常的時候運行。
異常發生可以處理,異常沒發生也可以處理,那么有沒有不管是否發生異常都進行處理的語句?
有try ... except ... finally ...,finally 下的語句塊不管有沒有發生異常都會執行。
示例4.4:
while運行程序:
接收一個除數:1 2.0 執行了finally語句塊 接收一個除數:0 發生了ZeroDivisionError異常 執行了finally語句塊如上 finally 下的語句塊,不管有沒有出現異常都會執行。
try ... except ... else ... finally ... 的使用順序
try ... except ... else ... finally...使用順序,else 必須在 except 后 finally 前,finally 只能在最后;else 與 finally 可有可無。
語法上 except 也可以缺少,不過少了except就不能捕獲異常,沒人會這樣寫代碼。
try五、拋出異常 raise
Python 可以使用 raise 語句拋出一個指定的異常
raiseraise 唯一的一個參數是指定要被拋出的異常。它必須是一個異常的實例或者是異常的類(也就是 Exception 的子類)。
示例:
raise輸出結果:
Traceback (most recent call last):raise NameError('使用一個還未賦值對象的變量') NameError: 使用一個還未賦值對象的變量try ... except ... finally ... 使用場景
try ... except ... finally ... 是非常常用,主要用于如關閉數據庫連接,文件關閉,釋放線程鎖等。
fo附件:異常類列表
來自官方文檔:5. Built-in Exceptions
BaseException+-- SystemExit+-- KeyboardInterrupt+-- GeneratorExit+-- Exception+-- StopIteration+-- StopAsyncIteration+-- ArithmeticError| +-- FloatingPointError| +-- OverflowError| +-- ZeroDivisionError+-- AssertionError+-- AttributeError+-- BufferError+-- EOFError+-- ImportError+-- ModuleNotFoundError+-- LookupError| +-- IndexError| +-- KeyError+-- MemoryError+-- NameError| +-- UnboundLocalError+-- OSError| +-- BlockingIOError| +-- ChildProcessError| +-- ConnectionError| | +-- BrokenPipeError| | +-- ConnectionAbortedError| | +-- ConnectionRefusedError| | +-- ConnectionResetError| +-- FileExistsError| +-- FileNotFoundError| +-- InterruptedError| +-- IsADirectoryError| +-- NotADirectoryError| +-- PermissionError| +-- ProcessLookupError| +-- TimeoutError+-- ReferenceError+-- RuntimeError| +-- NotImplementedError| +-- RecursionError+-- SyntaxError| +-- IndentationError| +-- TabError+-- SystemError+-- TypeError+-- ValueError| +-- UnicodeError| +-- UnicodeDecodeError| +-- UnicodeEncodeError| +-- UnicodeTranslateError+-- Warning+-- DeprecationWarning+-- PendingDeprecationWarning+-- RuntimeWarning+-- SyntaxWarning+-- UserWarning+-- FutureWarning+-- ImportWarning+-- UnicodeWarning+-- BytesWarning+-- ResourceWarning2020年4月16日,第一次更新,優化內容
總結
以上是生活随笔為你收集整理的python异常处理_Python入门 断言与异常处理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【GDAL】聊聊GDAL的数据模型
- 下一篇: vue process.env获取不到_