異常處理

既然須要異常處理,那麼就須要知道何時容易出現異常,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

 finally與else

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  # 只能接受一個布爾值

 異常處理

用if方式

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
if方式

用對象

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
class方式

 獲取異常的堆棧信息

import trance
try:
       …
except Exception as e:
         trance.format_exc()
相關文章
相關標籤/搜索