[oeasy]python0139_嘗試捕獲異常_ try_except_traceback
嘗試捕獲異常
回憶上次內(nèi)容
變量相加
整型數(shù)字變量可以相加
字符串變量也可以拼接
但是
字符串 和 整型數(shù)字
整型數(shù)字 和 字符串
不能相加
怎么辦?
int("1")
str(2)
轉(zhuǎn)格式
可是
int("abc")會發(fā)生什么????
字符串"abc"
如果輸入的蘋果數(shù)量是
先試試看
雖然我有了心理準(zhǔn)備
但是 python 顯然還沒有準(zhǔn)備好

要讓 python 知道
什么時候可能會出錯
簡化問題
python3 的意思是
不知道怎么把
abc
轉(zhuǎn)化為十進(jìn)制數(shù)不但 python3 沒有辦法轉(zhuǎn)化
我也沒有思路

有的時候數(shù)字中確實(shí)可以有
abc
的比如
0xa
這種形式這
0xabc
是可以轉(zhuǎn)化為數(shù)字的如何進(jìn)行區(qū)分呢
而
abc
是不能轉(zhuǎn)化的
思路
嘗試
轉(zhuǎn)化的工作出現(xiàn)在倒數(shù)第二行
total = int(a) + int(b)
需要做的
是
試
著 運(yùn)行這一行
既然 給了用戶輸入的 權(quán)利
就要處理 用戶輸入的錯誤
如果遇到了 不能轉(zhuǎn)化的情況
給用戶 一個 明確的報錯
就要處理
怎么才能讓 python3 試著運(yùn)行呢?
搜索 try
搜索一下 python3 + try

try
try 就是 試著來

把需要試著來的代碼部分放到 try 里面
試著 成功了
就繼續(xù)運(yùn)行 try里面的代碼
直到完成 try中所有的代碼
試著 失敗了
就跳轉(zhuǎn)到except部分 執(zhí)行
這就是
異常的處理
試著來
下面的源代碼
轉(zhuǎn)義成一個反斜杠
\
可以直接復(fù)制
系統(tǒng)會將兩個反斜杠
\\
注意
待嘗試的內(nèi)容需要縮進(jìn) 4 個字符
total = int(a) + int(b)
所有需要try的內(nèi)容都要
就像while True中需要循環(huán)的循環(huán)體
縮進(jìn)距離不多不少
縮進(jìn)
需要縮進(jìn)一樣
4個就很合適
是英文半角的
要緊跟著 try、except
冒號
縮進(jìn)
嘗試運(yùn)行
運(yùn)行失敗了
成功報了錯

原來想的是 試著執(zhí)行這句
total = int(a) + int(b)
可是這句 里面
不但進(jìn)行 類型轉(zhuǎn)化
還聲明了 一個變量 total
這個total
由于int("a") 會出現(xiàn)錯誤
根本沒有被聲明
而且 后面還要被引用
后面引用不到
所以報錯了
沒 try成功
怎么辦?
再次修正
都放 try 里面
嘗試
試試行不行

這次終于成功地報錯了!
或者說我接管了相關(guān)的報錯信息
對于這類錯有了自己的處理
這就是捕獲了異常
并且處理了異常
紅顏色的 error 好扎眼
我把他瞞下來
不報錯可以么?
不報錯
#!/usr/bin/pythona = input("How many apples do you got?\\n")print("You got " + a + " apples!") b = input("How many bananas do you got?\\n")print("You got " + b + " bananas!")try: ? ?total = int(a) + int(b) ? ?print("You got " + str(total) + " fruits!")except: ? ?pass
<font style="color:red;font-size:48px;">這不行!!!??</font>
異常錯誤不處理不行
要明確得處理
要明確的報錯
知道哪里錯了
才好修改
如果假裝沒犯錯
就會完全沒有處理線索
程序大了絕對讓人徹底崩潰
對應(yīng)禪語
錯誤不應(yīng)被悄悄傳遞
除非你確定需要這樣做

精準(zhǔn)地捕獲異常
不寫 except:pass 風(fēng)格的代碼
那什么是 except:pass 風(fēng)格的代碼呢?
異常飄過
就是 那種
知錯不報錯
的方式雖然 except接收到了錯誤
但是 輕輕飄過pass

上面這是錯的!
這是最要命的
讓人沒有追蹤trace的痕跡
無法調(diào)試debug!
無語問蒼天??!
不但要有自己的報錯
還要保留系統(tǒng)的報錯
有可能嗎?
保留報錯

最終結(jié)果

可以讓報錯詳細(xì)一些嗎?
比如文件、行號
保留報錯細(xì)節(jié)

import traceback
traceback.print_exc()

總結(jié)
這次學(xué)習(xí)了
try
except
注意要點(diǎn)
半角冒號
縮進(jìn)
錯誤信息輸出
有錯就處理
系統(tǒng)報錯信息原樣輸出
不要忽略、隱瞞
否則找不到出錯位置
還可以用traceback把
但是代碼量好多啊
10多 行了 ??
可以把他輸入部分和輸出部分么???
我們下次再說!??
藍(lán)橋->https://www.lanqiao.cn/courses/3584
github->https://github.com/overmind1980/oeasy-python-tutorial
gitee->https://gitee.com/overmind1980/oeasypython