tft每日頭條

 > 圖文

 > 關于python的異常處理

關于python的異常處理

圖文 更新时间:2025-02-01 14:39:46
1 錯誤

錯誤 通常是指程序中的 語法錯誤 或 邏輯錯誤,來通過兩個 Python 例子看一下:

語法錯誤示例

# print前面少了 : if True print("hello python")

我們編寫程序通常使用開發工具編寫,比如:我使用 Pycharm 工具編寫 Python 程序,像這種語法錯誤,在編寫程序時,編譯器就會檢測出來并提示我們,因此,我們編寫好的程序幾乎不會出現這種問題。

邏輯錯誤示例

# 0 是不能作為被除數的 a = 5 b = 0 print(a/b) #執行結果: zeroDivisionError: division by zero

邏輯錯誤編譯器是不會提示我們的,因此,我們編寫程序時,對一些基本常識要有一定了解,從而,避免出現邏輯錯誤。

2 異常

即便 Python 程序的語法是正确的,在運行它的時候,也有可能發生錯誤,運行期檢測到的錯誤被稱為異常;大多數的異常都不會被程序處理,都以錯誤信息的形式展現。

2.1 内置異常

我們先來看一下異常層次結構:

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 -- ResourceWarning

通過上面的異常層次結構,我們可以清晰的看出,BaseException為所有異常的基類,其下面分為:SystemExit、KeyboardInterrupt、GeneratorExit、Exception 四類異常,Exception 為所有非系統退出類異常的基類,Python 提倡繼承 Exception 或其子類派生新的異常;Exception 下包含我們常見的多種異常如:MemoryError(内存溢出)、BlockingIOError(IO異常)、SyntaxError(語法錯誤異常)…

詳細說明可以查看下面列表:

關于python的異常處理(python之錯誤與異常)1

關于python的異常處理(python之錯誤與異常)2

關于python的異常處理(python之錯誤與異常)3

關于python的異常處理(python之錯誤與異常)4

2.2 異常處理

Python 程序捕捉異常使用 try/except 語句,先看個例子:

# 1.被除數為 0,未捕獲異常 def getNum(n): return 10 / n print(getNum(0)) #輸出結果: ZeroDivisionError: division by zero # 2.捕獲異常 def getNum(n): try: return 10 / n except IOError: print('Error: IOError argument.') except ZeroDivisionError: print('Error: ZeroDivisionError argument.') print(getNum(0)) ''' 輸出結果: Error: ZeroDivisionError argument. None '''

try 語句的工作方式為:

首先,執行 try 子句 (在 try 和 except 關鍵字之間的部分);如果沒有異常發生, except 子句 在 try 語句執行完畢後就被忽略了;如果在 try 子句執行過程中發生了異常,那麼該子句其餘的部分就會被忽略;如果異常匹配于 except 關鍵字後面指定的異常類型,就執行對應的except子句,然後繼續執行 try 語句之後的代碼;如果發生了一個異常,在 except 子句中沒有與之匹配的分支,它就會傳遞到上一級 try 語句中;如果最終仍找不到對應的處理語句,它就成為一個 未處理異常,終止程序運行,顯示提示信息。

try/except 語句還可以帶有一個 else、finally子句,示例如下:

def getNum(n): try: print('try --> ',10 / n) except ZeroDivisionError: print('except --> Error: ZeroDivisionError argument.') else: print('else -->') finally: print('finally -->') ''' 1.調用:getNum(0) 輸出結果: except --> Error: ZeroDivisionError argument. finally --> 2.調用:getNum(1) 輸出結果: try --> 10.0 else --> finally --> '''

其中,else 子句隻能出現在所有 except 子句之後,隻有在沒有出現異常時執行;finally 子句放在最後,無論是否出現異常都會執行。

2.3 抛出異常

使用 raise 語句允許強制抛出一個指定的異常,要抛出的異常由 raise 的唯一參數标識,它必需是一個異常實例或異常類(繼承自 Exception 的類),如:

raise NameError('HiThere')

2.4 自定義異常

正常來說,Python 提供的異常類型已經滿足我們的使用了,但是有時候我們有定制性的需求,我們可以自定義異常類,繼承自 Error 或 Exception 類就可以了,看個例子:

# 自定義異常類 MyExc class MyExc(Exception): #繼承Exception類 def __init__(self, value): self.value = value def __str__(self): if self.value == 0: return '被除數不能為0' # 自定義方法 def getNum(n): try: if n == 0: exc = MyExc(n) print(exc) else: print(10 / n) except: pass ''' 1.調用 getNum(1),輸出結果為: 10.0 2.調用 getNum(0),輸出結果為: 被除數不能為0 '''

在這個自定義的異常例子中,當參數 n 不為 0 時,則正常,當 n 等于 0,則抛出異常,自定義異常在實際應用中很少用到。

,

更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!

查看全部

相关圖文资讯推荐

热门圖文资讯推荐

网友关注

Copyright 2023-2025 - www.tftnews.com All Rights Reserved