例外处理 ( try、except )
执行 Python 程序的时候,往往会遇到“错误”的状况,如果没有好好处理错误状况,就会造成整个程序坏掉而停止不动,因此,透过“例外处理”的机制,能够在发生错误时进行对应的动作,不仅能保护整个程序的流程,也能够掌握问题出现的位置,马上进行修正。
快速导览:使用 try 和 except、加入 pass、except 印出错误信息、raise 和 assert、加入 else 和 finally
本篇使用的 Python 版本为 3.7.12,所有范例可使用 Google Colab 实作,不用安装任何软件 ( 参考:使用 Google Colab )
使用 try 和 except
下方的例子执行后,会发生“TypeError”的错误 ( 因为输入的是文字,文字无法和数字相加 ),也因为发生错误,进而造成程序停止,后方程序无法正常执行。
a = input('輸入數字:')
print(a + 1) # 發生錯誤
print('hello') # 因為發生錯誤,造成程式停止,所以後方程式無法執行
如果要避免程序因错误而停止,可使用 try 和 except 进行保护 ( 或测试 ),当 try 区段内的程序发生错误时,就会执行 except 里的内容,如果 try 的程序没有错误,就不会执行 except 的内容,当程序修改成下面的样子,就会顺利印出后方的 hello。
try: # 使用 try,測試內容是否正確
a = input('輸入數字:')
print(a + 1)
except: # 如果 try 的內容發生錯誤,就執行 except 裡的內容
print('發生錯誤')
print('hello')
加入 pass 略过
在撰写 try... except 有时候会遇到“不想做任何动作”的状况 ( 连 print 都不想使用 ),这时可以使用 pass 语法来略过 ( 什么事情都不做 ),以下方的程序而言,当发生错误时,进入 excpet 后就会直接忽略并跳过。
try: # 使用 try,測試內容是否正確
a = input('輸入數字:')
print(a + 1)
except: # 如果 try 的內容發生錯誤,就執行 except 裡的內容
pass # 略過
print('hello')
except 的错误信息
只要程序发生错误,控制台中都会出现对应的错误信息,下方列出常见的几种错误信息 ( 详细错误信息参考:Built-in Exceptions ):
| 错误信息 | 说明 |
|---|---|
| NameError | 使用没有被定义的对象 |
| IndexError | 索引值超过了序列的大小 |
| TypeError | 数据类型 ( type ) 错误 |
| SyntaxError | Python 语法规则错误 |
| ValueError | 传入值错误 |
| KeyboardInterrupt | 当程序被手动强制中止 |
| AssertionError | 程序 asset 后面的条件不成立 |
| KeyError | 键发生错误 |
| ZeroDivisionError | 除以 0 |
| AttributeError | 使用不存在的属性 |
| IndentationError | Python 语法错误 ( 没有对齐 ) |
| IOError | Input/output异常 |
| UnboundLocalError | 区域变数和全域变数发生重复或错误 |
下面的程序执行时,因为变数 a 还没被定义,所以会进入 except NameError 的区段,印出“使用没有被定义的对象”。
try:
print(a)
except TypeError:
print('型別發生錯誤')
except NameError:
print('使用沒有被定義的對象')
print('hello')
如果不知道错误的型别,只想印出错误信息,除了单纯用 except,也可以使用“except Exception”,将例外的信息全部放在里面。
try:
print(1/0)
except TypeError:
print('型別發生錯誤')
except NameError:
print('使用沒有被定義的對象')
except Exception:
print('不知道怎麼了,反正發生錯誤惹')
print('hello')
如果单纯使用 except Exception as e,也能将所有的错误信息全部印出。
try:
a = 1
b = '1'
print(a+b)
except Exception as e:
print(e)
raise 和 assert
在执行 try 的过程中,如果遇到需要“强制中断”的情形,可使用 raise 强制中断。
try:
a = int(input('輸入 0~9:'))
if a>9: # 如果輸入的 a 大於 9
raise # 強制中斷,拋出錯誤資訊席
print(a)
except :
print('有錯誤喔~') # 收到錯誤訊息,顯示錯誤
raise 后方可以加上错误信息,错误信息可以包含要呈现的消息,以下方的例子而言,强制停止时回报 ValueError 信息,接着使用 except 区隔错误信息,就能呈现真实的错误状况。
try:
a = int(input('輸入 0~9:'))
if a>10:
raise ValueError('數字不在範圍內')
print(a)
except ValueError as msg: # 如果輸入範圍外的數字或解析非 10 進位數字,執行這邊的程式
print(msg)
except : # 其他錯誤,執行這邊的程式
print('有錯誤喔~')
print('繼續執行')
使用 assert 中断的方法为“assert False, '錯誤訊息'”,用法和 raise 类似,执行后就会中断程序,并将错误信息提供给 except 显示,下方的程序如果输入 123,会执行 AssertionError 里的程序,如果输入 abc 则会执行 except 里的程序。
try:
a = int(input('輸入 0~9:'))
if a>10:
assert False, '數字不在範圍內'
print(a)
except AssertionError as msg:
print(msg)
except :
print('有錯誤喔~')
print('繼續執行')
加入 else 和 finally
在 except 结束后,可以加入 else 或 finally 两个额外的判断,else 表示完全没有错误,就会执行该区块的程序,finally 则不论程序对错,都会执行该区块的程序。
try:
a = int(input('輸入 0~9:'))
if a>10:
raise
print(a)
except :
print('有錯誤喔~')
else:
print('沒有錯!繼續執行!') # 完全沒錯才會執行這行
finally:
print('管他有沒有錯,繼續啦!') # 不論有沒有錯都會執行這行
微信扫码关注
抖音扫码关注