作者介紹:【孤寒者】—CSDN全棧領域優質創作者、HDZ核心組成員、華為雲享專家Python全棧領域博主、CSDN原力計劃作者
- 本文已收錄於Python全棧系列專欄:《Python全棧基礎教程》
- 熱門專欄推薦:《Django框架從入門到實戰》、《爬蟲從入門到精通系列教程》、《爬蟲高級》、《前端系列教程》、《tornado一條龍+一個完整版項目》。
- 本專欄面向廣大程序猿,為的是大家都做到Python從入門到精通,同時穿插有很多很多習題,鞏固學習。
- 訂閱專欄後可私聊進一千多人Python全棧交流群(手把手教學,問題解答);進群可領取Python全棧教程視頻 + 多得數不過來的計算機書籍:基礎、Web、爬蟲、數據分析、可視化、機器學習、深度學習、人工智能、算法、面試題等。
- 加入我一起學習進步,一個人可以走的很快,一群人才能走的更遠!
注意:
當代碼出現了異常,後面的代碼都不會執行;
異常本身是類。
在 Python 中所有的異常都是繼承自 BaseException
直接分為四大類:
SystemExit:Python退出異常;
KeyboardInterrupt: 鍵盤打斷(Ctrl+C);
GeneratorExit: 生成器退出(前面講過了哦~);
Exception: 普通異常(只會使用這部分的異常)。
最基本的try…except…語句:
try:
print(11) # 這是正確的,會打印出來
print(a) # a沒定義,所以會出現異常
print(22) # 因為上面一句出現了異常,所以即使這句是正確的,也不會打印
except:
print('這裡出現了異常')
輸出:
11
這裡出現了異常
try:
正常的操作
except Exception1[, Exception2[,...ExceptionN]]][,Argument]as err:
發生異常,執行這塊代碼
else:
如果沒有異常執行這塊代碼
finally:
退出try時總會執行執行這塊代碼
try:
pass
except TabError:
pass
except NameError:
pass
except (RuntimeError, TypeError, NameError):
pass
# -*- 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
# -*- coding: utf-8 -*-
""" __author__ = 小小明-代碼實體 """
try:
fh = open("testfile", "r")
try:
fh.write("這是一個測試文件,用於測試異常!!")
finally:
print("關閉文件")
fh.close()
except IOError as value:
print("Error: 沒有找到文件或讀取文件失敗:", value)
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)
輸出為:
出現錯誤
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)
輸出:
出現錯誤啦
小總結:
異常類繼承自 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
【官方文檔~】
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
問題一: 如何能在代碼中強制要求一個條件滿足 ?
問題二: 是否有專門的語法來完成 ?
assert 的語法規則是:
來個簡單的例子:
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)
第一種輸出:
你是誰:吳某
歡迎你 吳某
第二種輸出:
你是誰:中國
你不是吳某