程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

24.Python文件I/O(二)【異常處理&斷言assert】

編輯:Python

目錄:

  • 每篇前言:
  • Python文件I/O(二)
    • 知識點補給站:
    • 1.1 異常處理
      • 1.1.1 拋出異常
      • 1.1.2 自定義異常
      • 1.1.3 python異常體系
    • 1.2 拓展——斷言

每篇前言:

  • 作者介紹:【孤寒者】—CSDN全棧領域優質創作者、HDZ核心組成員、華為雲享專家Python全棧領域博主、CSDN原力計劃作者

  • 本文已收錄於Python全棧系列專欄:《Python全棧基礎教程》
  • 熱門專欄推薦:《Django框架從入門到實戰》、《爬蟲從入門到精通系列教程》、《爬蟲高級》、《前端系列教程》、《tornado一條龍+一個完整版項目》。
  • ​本專欄面向廣大程序猿,為的是大家都做到Python從入門到精通,同時穿插有很多很多習題,鞏固學習。
  • 訂閱專欄後可私聊進一千多人Python全棧交流群(手把手教學,問題解答);進群可領取Python全棧教程視頻 + 多得數不過來的計算機書籍:基礎、Web、爬蟲、數據分析、可視化、機器學習、深度學習、人工智能、算法、面試題等。
  • 加入我一起學習進步,一個人可以走的很快,一群人才能走的更遠!

Python文件I/O(二)

知識點補給站:

  • 注意:
    當代碼出現了異常,後面的代碼都不會執行;
    異常本身是類。

  • 在 Python 中所有的異常都是繼承自 BaseException

  • 直接分為四大類:
    SystemExit:Python退出異常;
    KeyboardInterrupt: 鍵盤打斷(Ctrl+C);
    GeneratorExit: 生成器退出(前面講過了哦~);
    Exception: 普通異常(只會使用這部分的異常)。

最基本的try…except…語句:

try:
print(11) # 這是正確的,會打印出來
print(a) # a沒定義,所以會出現異常
print(22) # 因為上面一句出現了異常,所以即使這句是正確的,也不會打印
except:
print('這裡出現了異常')
輸出:
11
這裡出現了異常

1.1 異常處理

try:
正常的操作
except Exception1[, Exception2[,...ExceptionN]]][,Argument]as err:
發生異常,執行這塊代碼
else:
如果沒有異常執行這塊代碼
finally:
退出try時總會執行執行這塊代碼
  • 捕獲具體的異常:
    except 後面可以寫上捕獲具體的異常類型 ,
    還可以通過as 把捕獲的異常信息 儲存到後面的變量裡面。
  • 一個 try 語句可能包含多個except子句,分別來處理不同的特定的異常。最多只有一個分支會被執行。但是需要注意的是try 後面必須跟上 except子句!
try:
pass
except TabError:
pass
except NameError:
pass
  • 一個except子句可以同時處理多個異常,這些異常將被放在一個括號裡成為一個元組,例如:
except (RuntimeError, TypeError, NameError):
pass
  • 最後一個except子句可以忽略異常的名稱,它將被當作通配符使用。你可以使用這種方法打印一個錯誤信息,然後再次把異常拋出。
    比如,我們並沒有tmp.txt這個文件,下述代碼會輸出什麼呢?
# -*- coding: utf-8 -*-
""" __author__ = 小小明-代碼實體 """
import sys
try:
f = open('tmp.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

  • 再比如我們還是沒有testfile這個文件,下述代碼會輸出什麼呢?如果有又會輸出什麼呢?大家自行嘗試哦~
# -*- coding: utf-8 -*-
""" __author__ = 小小明-代碼實體 """
try:
fh = open("testfile", "r")
try:
fh.write("這是一個測試文件,用於測試異常!!")
finally:
print("關閉文件")
fh.close()
except IOError as value:
print("Error: 沒有找到文件或讀取文件失敗:", value)

  • 關於 Exception 及其 子類 的解釋:
    代碼中會出現的異常都是 Exception 的子類, 因此在 except 中只需要在最後加上 Exception 即可;
    在捕獲異常的過程中,會從上倒下依次對比異常,找到之後就不會再往後查找。

1.1.1 拋出異常

Python 使用 raise 語句拋出一個指定的異常(注意:raise是主動拋出後面寫的異常類型)。例如:

>>>raise NameError('HiThere')
Traceback (most recent call last):
File "<stdin>", line 1, in ?
NameError: HiThere

可以自己寫自定義的異常:

class WuMou(Exception):
pass
raise WuMou('出現錯誤')

輸出為:

Traceback (most recent call last):
File "C:/my/pycharm_work/ceshi.py", line 3, in <module>
raise WuMou('出現錯誤')
__main__.WuMou: 出現錯誤

可以捕獲這個異常:

class WuMou(Exception):
pass
try:
raise WuMou('出現錯誤')
except WuMou as h:
print(h)

輸出為:

出現錯誤
  • raise 唯一的一個參數指定了要被拋出的異常。它必須是一個異常的實例或者是異常的類(也就是 Exception 的子類)。
  • 如果你只想知道這是否拋出了一個異常,並不想去處理它,那麼一個簡單的 raise 語句就可以再次把它拋出。
try:
raise NameError('HiThere')
except NameError:
print('An exception flew by!')
raise


結合捕獲異常一起使用:
例子:

try:
while True: #可以結束死循環
if 1 == 1:
raise NameError('出現錯誤啦')
except Exception as e:
print(e)

輸出:

出現錯誤啦

小總結:

  • 將可能會發生異常的代碼放在try中,就可以得到異常,並做相應處理
  • except用來接受異常,並且可以拋出或者返回異常
  • else在沒有異常的時候會執行,finally不管是否有異常,都會執行

1.1.2 自定義異常

異常類繼承自 Exception 類,可以直接繼承,或者間接繼承,例如:

# -*- coding: utf-8 -*-
""" __author__ = 小小明-代碼實體 """
class MyError(Exception):
def __init__(self, value):
self.value = value
def __str__(self):
return str(self.value)
try:
raise MyError(2 * 2)
except MyError as e:
print('My exception occurred, value:', e.value)

raise MyError('oops!')


當創建一個模塊有可能拋出多種不同的異常時,一種通常的做法是為這個包建立一個基礎異常類,然後基於這個基礎類為不同的錯誤情況創建不同的子類:

class Error(Exception):
pass
class InputError(Error):
def __init__(self, expression, message):
self.expression = expression
self.message = message
class TransitionError(Error):
def __init__(self, previous, next, message):
self.previous = previous
self.next = next
self.message = message
  • 大多數的異常的名字都以"Error"結尾,就跟標准的異常命名一樣。

1.1.3 python異常體系

【官方文檔~】

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




1.2 拓展——斷言

問題一: 如何能在代碼中強制要求一個條件滿足 ?
問題二: 是否有專門的語法來完成 ?

  • 斷言 assert
  • 斷言語句是將調試斷言插入程序的一種便捷方式

assert 的語法規則是:

  • 表達式返回 True 不報錯
  • 表達式返回 False 報錯 報 AssertionError

來個簡單的例子:

a = input('你是誰:')
assert a == '吳某','你不是吳某'
print('歡迎你 吳某')

第一種輸出為:

你是誰:吳某
歡迎你 吳某

第二種輸出為:

你是誰:中國
Traceback (most recent call last):
File "C:/my/pycharm_work/ceshi.py", line 2, in <module>
assert a == '吳某','你不是吳某'
AssertionError: 你不是吳某

升級一點的例子:

a = input('你是誰:')
try:
assert a == '吳某','你不是吳某'
print('歡迎你 吳某')
except AssertionError as f:
print(f)

第一種輸出:

你是誰:吳某
歡迎你 吳某

第二種輸出:

你是誰:中國
你不是吳某

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved