python語法基礎學習筆記Task08:異常處理

1、語法錯誤

while True print('Hello world')
  File "<stdin>", line 1, in ?
    while True print('Hello world')
                   ^
SyntaxError: invalid syntax
  • 函數 print() 被檢查到有錯誤,是它前面缺少了一個冒號(:)
  • 語法分析器指出了出錯的一行,並且在最先找到的錯誤的位置標記了一個小小的箭頭

2、異常

  • 即便Python程序的語法是正確的,在運行它的時候,也有可能發生錯誤,運行期檢測到的錯誤被稱爲異常。
  • 大多數的異常都不會被程序處理,都以錯誤信息的形式展現
  • 異常以不同的類型出現,這些類型都作爲信息的一部分打印出來: 例子中的類型有 ZeroDivisionError,NameError 和 TypeError
  • 錯誤信息的前面部分顯示了異常發生的上下文,並以調用棧的形式顯示具體信息
>>>10 * (1/0)
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
ZeroDivisionError: division by zero
>>> 4 + spam*3
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
NameError: name 'spam' is not defined
>>> '2' + 2
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
TypeError: Can't convert 'int' object to str implicitly

3、異常處理

try-except語句

  • 首先,執行try子句(在關鍵字try和關鍵字except之間的語句)
  • 如果沒有異常發生,忽略except子句,try子句執行後結束
  • 如果在執行try子句的過程中發生了異常,那麼try子句餘下的部分將被忽略。如果異常的類型和 except 之後的名稱相符,那麼對應的except子句將被執行,最後執行 try 語句之後的代碼
  • 如果一個異常沒有與任何的except匹配,那麼這個異常將會傳遞給上層的try中
  • 一個 try 語句可能包含多個except子句,分別來處理不同的特定的異常。最多隻有一個分支會被執行
  • 一個except子句可以同時處理多個異常,這些異常將被放在一個括號裏成爲一個元組
except (RuntimeError, TypeError, NameError):
        pass
  • 最後一個except子句可以忽略異常的名稱,它將被當作通配符使用。可以使用這種方法打印一個錯誤信息,然後再次把異常拋出
try:
    f = open('myfile.txt')
    s = f.readline()
    i = int(s.strip())
except OSError as err:
    print("OS error: {0}".format(err))
except ValueError:
    print("Could not convert data to an integer.")
except:
    print("Unexpected error:", sys.exc_info()[0])
    raise

try-except-else語句

  • 如果使用這個子句,那麼必須放在所有的except子句之後,這個子句將在try子句沒有發生任何異常的時候執行
  • 使用 else 子句比把所有的語句都放在 try 子句裏面要好,這樣可以避免一些意想不到的、而except又沒有捕獲的異常
for arg in sys.argv[1:]:
    try:
        f = open(arg, 'r')
    except IOError:
        print('cannot open', arg)
    else:
        print(arg, 'has', len(f.readlines()), 'lines')
        f.close()
  • 異常處理並不僅僅處理那些直接發生在try子句中的異常,而且還能處理子句中調用的函數(甚至間接調用的函數)裏拋出的異常
def this_fails():
        x = 1/0   
try:
        this_fails()
    except ZeroDivisionError as err:
        print('Handling run-time error:', err)
   
Handling run-time error: int division or modulo by zero

4、拋出異常

raise 語句----拋出一個指定的異常

  • raise 唯一的一個參數指定了要被拋出的異常,它必須是一個異常的實例或者是異常的類(也就是 Exception 的子類)
raise NameError('HiThere')
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
NameError: HiThere
  • 如果只想知道這是否拋出了一個異常,並不想去處理它,那麼一個簡單的 raise 語句就可以再次把它拋出
try:
        raise NameError('HiThere')
    except NameError:
        print('An exception flew by!')
        raise
   
An exception flew by!
Traceback (most recent call last):
  File "<stdin>", line 2, in ?
NameError: HiThere

5、python標準異常總結
在這裏插入圖片描述
參考文獻

  • https://www.runoob.com/python3/python3-errors-execptions.html
  • https://blog.csdn.net/LSGO_MYP/article/details/102807018
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章