1樓:Coldwings
你自己琢磨琢磨這個邏輯:
丟擲了乙個異常,TypeError,你怎麼確定到底輸出啥?什麼時候輸出前一句什麼時候輸出後一句?畢竟你只捕獲了錯誤型別,程式執行到這裡也只是知道乙個錯誤型別,完全不能判斷到底需要被哪個分支捕獲,那麼自然是遵循幾乎所有程式語言裡try block錯誤捕獲的共同原則:
錯誤丟擲給第乙個捕獲的語句塊。
所以結論是,要麼寫乙個except塊來捕獲TypeError,然後再在塊內用條件判斷再次檢查你覺得可能會出錯的變數確定到底是哪種情況然後再輸出你的錯誤資訊;要麼捕獲異常例項,不要只捕獲異常型別,然後再通過異常例項裡記錄的錯誤資訊來判斷你要輸出什麼。
前者類似於
try:
...except
TypeError:if
notisinstance(x
,collections
.Iterable
):print("'
%s' object is not iterable"
%type(x
))else
("a bytes-like object is required, not 'str'"
)而後者類似於
try:
...except
TypeErrorase
:print(e
)#或者加入其它判斷條件
說到底,為啥要特意輸出個字串?為啥都拋TypeError而不是自己定義幾個異常?為啥不是在異常裡帶異常資訊而是print乙個常量字串?這做法很不地道的……
Python2轉Python3有沒有必要重新學習?
NeGoo 用一門語言無非是好用,其實用Python無關2.7Or3.6,用的好用稱手足矣。現在有很多庫是基於2的,3不好用的時候嘗試下2,相反嘗試下3,總會找到自己的感覺。本人拙見。 XIVN1987 Python 2的程式在Python 3下沒法執行是真的,而且要改成能執行的可能還很麻煩!但是如...
關於python3命名空間的問題?
李小離 區域性命名空間裡已經有 a 這個變數了,當然不會再向上搜尋啦。只不過 a 沒有被賦值,所以產生了 UnboundLocalError。 42nd Mu00 a 1相當於a a 1,賦值操作右邊的先執行,然而區域性作用域內沒有出現的變數名被賦值就預設優先為初始化,自然會矛盾報錯了。加個glob...
Python3如何實現兩個列表的交叉列印?
defiter cross iterables copy iter item for item initerables while copy 一直迭代到copy列表為空 foritem incopy try yield next item except StopIteration 如果next 丟擲...