既然須要異常處理,那麼就須要知道何時容易出現異常,html
當內容不肯定的時候容易出現異常,例如:有用戶參與進行交互,或者有外界的數據,文件中或是網絡上python
當嵌套調用的過程當中內部出現問題時,外部調用的部分都會報錯.網絡
python標準異常移步→菜鳥ide
# except處理的異常必須和實際報錯的異常是相同的 try: num = int(input('num >>>')) except ValueError: print('請輸入一個數字')
try: num = int(input('num >>>')) print(l[num - 1]) # 從上向下報錯的代碼只要找到一個和報錯類型相符的分支就執行這個分支中的代碼,而後直接退出分支 except ValueError: print('請輸入一個數字') # 若是找不到能處理和報錯類型相同的分支,會一直往下走,最後仍是沒有找到就會報錯 except IndexError: print('只能輸入1或2')
try: num = int(input('num >>>')) print(l[num - 1]) except (ValueError, IndexError): print('您輸入的內容不合法')
try: func = l[num - 1][1] func() except Exception: print('發生了不可知的異常')
as語法能夠將具體錯誤打印出來spa
try: func = l[num - 1][1] func() except Exception as e: print(e) print(e.args,e.__traceback__.tb_lineno,e.__traceback__.tb_frame) print('用戶在選擇了%s操做以後發生了不可知的異常' )
# try + except至關於萬能異常 try: int('aaa') except: print(123)
注意:當多分支與萬能異常同時使用時,萬能異常必須在多分支異常的下面code
try: print('aaa') # 給某某某發郵件 name # [][1] # 1/0 except NameError: # 網絡不穩定,郵箱地址錯誤 print('name error') except IndexError: print('index error') except Exception as e: print('Exception') else: # 當try中的代碼不發生異常的時候 走else分支 若是發送成功了 進行一些處理 print('else') finally: # 不管如何都會被執行 print('finally')
注:當try中的代碼不發生異常的時候 走else分支 若是發送成功了 進行一些處理,finally不管如何都會被執行,且就算是return也會先執行finally,即便是報錯程序結束,也會在結束前執行finally代碼orm
raise ValueError
class MyException(Exception): def __init__(self, name, msg): self.name = name self.msg = msg try: raise MyException("這是", "自定義異常") except MyException as obj: print(obj.name, obj.msg)
assert 1==2 # 只能接受一個布爾值
def func(path, prev): """ 去path路徑的文件中,找到前綴爲prev的一行數據,獲取數據並返回給調用者。 1000,成功 1001,文件不存在 1002,關鍵字爲空 1003,未知錯誤 ... :return: """ respond = {"code": 1000, "word": None} try: if not os.path.exists(path): respond["code"] = 1001 respond["word"] = "文件不存在" if not prev: respond["code"] = 1002 respond["word"] = "關鍵字爲空" except Exception: respond["code"] = 1003 respond["word"] = "未知錯誤" return respond
import os class ExistsError(Exception): def __init__(self, num, name): self.num = num self.name = name class KeyInvalidError(Exception): def __init__(self, num, name): self.num = num self.name = name def new_func(path, prev): """ 去path路徑的文件中,找到前綴爲prev的一行數據,獲取數據並返回給調用者。 1000,成功 1001,文件不存在 1002,關鍵字爲空 1003,未知錯誤 ... :return: """ response = {'code': 1000, 'data': None} try: if not os.path.exists(path): raise ExistsError(1001, "文件不存在") if not prev: raise KeyInvalidError(1002, "關鍵字爲空") pass except ExistsError as obj: response['code'] = obj.num response['data'] = obj.name except KeyInvalidError as obj: response['code'] = obj.num response['data'] = obj.name except Exception: response['code'] = 1003 response['data'] = '未知錯誤' return response
import trance try: … except Exception as e: trance.format_exc()