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