26 day of python

异常处理

1, 语法错误: 你程序未执行之前,pycharm已经给你做了提示了,

name
if 1 > 0;
    pass
age == 3

2, 逻辑错误

num = int(input('>>>'))

可预知,不可预知的,

你见过的异常:

num = int(input('>>>'))  #ValueError
name  # NameError
if 1 > 0;  # SyntaxError
dic = {}
dic['key']  # KeyError
li = [1,2,3]
li[10]  # IndexError
import ac  # ImportError

什么是异常??

由错误引发的,而且出现异常就会终止程序。

为什么要进行异常处理:

1,异常就会终止程序员,用户体验极差,

2,让你的代码不冗余。

异常处理:

1,if,异常处理  他只能处理简单的逻辑。

num = input('>>>')
if num.isdigit():
    num = int(num):
    if 1<= num <=5:
        if
else:
    print('有非数字类型....')

2,try.异常处理

遇到报错信息,防止程序终止,执行另一个语句.

2.1 单独一个条件.单支.

try:
    num = int(input('>>>'))    # ValueError
    name    # NameError
    # if 1 > 0;            # SyntaxError
    dic = {}
    dic['key']            # KeyError
    li = [1,2,3]
    li[10]                # IndexError
    import ac            # ImportError
except NameError:
    print('出现了NameError错误')
print(111)
print(222)
print(333)
print(114441)

出现了NameError错误
111
222
333
114441

多分支。

try:
    num = int(input('>>>'))  #ValueError
    name  # NameError
    dic = {}
    dic['key']  # KeyError
    li = [1,2,3]
    li[10]  # IndexError
    import ac  # ImportError
except NameError:
    print('出现了NameError错误')
except ValueError:
    print('出现了ValueError错误')
except KeyError:
    print('出现了KeyError错误')

print(222)
print(333)
print(114441)
class A:
def __str__(self):
return 'list index out of range'
a1 = A()
print(a1)

 3 万能异常处理。

try:
    # num = int(input('>>>'))      #ValueError
    # name      # NameError
    dic = {}
    # dic['key']      # KeyError
    li = [1,2,3]
    li[10]  # IndexError
    import ac      # ImportError
except Exception as e:
    # print('您输入的不规范,请重新输入...')
    print('稍等片刻,去去就来...')

异常处理的两种解决方式:

1,只是显示错误信息,不终止程序就行。万能的

2,针对不同的错误,提示不同的信息,进行不同的操作。    多分支

def login():
    pass

def regsiter():
    pass

def article():
    pass

def dariy():
    pass
dic = {
    1:login,
    2:regsiter,
    3:article,
    4:dariy,
}
while True:
    choice = input('请输入:')
    if choice.isdigit():
        choice = int(choice)
        if 1 <= choice <=4:
            dic[choice]()

        else:
            print('请范围内的数字...')
    else:
        print('请输入数字...')
def login():
    pass

def regsiter():
    pass

def article():
    pass

def dariy():
    pass
dic = {
    1:login,
    2:regsiter,
    3:article,
    4:dariy,
}
while True:
    try:
        choice = int(input('请输入:'))
        dic[choice]()
    except ValueError:
        print('请输入数字...')
    except KeyError:
        print('请范围内的数字...')

4 多分支+万能.

while True:
    try:
        choice = int(input('请输入:'))
        dic[choice]()
    except ValueError:
        print('请输入数字...')
    except Exception as e:
        print(e)
    except KeyError:
        print('请范围内的数字...')

try:
    choice = int(input('请输入:'))
except ValueError:
    print('请输入数字...')
except KeyError:
    print('请范围内的数字...')
except Exception as e:
    print(e)

2.5 try  except except ...  else

如果程序出现异常执行except,就不会执行else,反之则执行else

try:
    print('我的卡扣除100元')
    print('旭哥的卡增加了100元')
except NameError:
    print('转账出现异常...')
else:
    print('转账成功')

2.6

try  except except ...  else  .finally

try finally

try:
    print('我的卡扣除100元')
    name
    print('旭哥的卡增加了100元')
except NameError:
    print('转账出现异常...')
else:
    print('转账成功')
finally:
    print('6666666')
name
print(666)        # 666不执行
try:
    name
finally:
    print(666)      # 666执行了
try:
    f = open('t1',encoding='utf-8')
    print(f.read())
    '''多个文件句柄的操作'''
    f.write()
finally:
    f.close()
    print(666)
# 最后close()
# f.close()
def func():
    try:
        return 555
    finally:
        '''代码块'''
        print(777)
func()
try finally  关闭文件句柄,关闭数据库的链接,关闭网络链接等等

2.7 主动触发异常

raise TypeError('类型错误')
class Payment:
    def pay(self,money):
        raise TypeError('你的类中应该有一个pay方法')
class QQ(Payment):
    def pay(self,money):
        print('您用qq支付了%s元' % money)
class Wechat(Payment):
    def pay(self,money):
        print('您用微信支付了%s元' % money)
def pay(obj,money):
    obj.pay(money)      #a1.pay(200)

q1 = QQ()
w1 = Wechat()
pay(w1,1000)

2.8 自定义异常(大项目,针对于python不具备的一些错误类型.)

raise TypeError('类型错误')
name1 : python解释器没法解决的错误: 周星星

class 周星星(BaseException):
    def __init__(self,msg):
        self.msg=msg
    def __str__(self):
        return self.msg

# # raise EvaException('EvaException:错误!!!!' )
# # raise TypeError('EvaException:错误!!!!' )
try:
    raise 周星星('EvaException:错误!!!!' )
except 周星星 as e:  # e = EvaException('类型错误')
    print(e)

断言 源码 主动抛出异常

condition = 1 > 2
assert condition  # 如果条件不满足强行终止.
print(111)
print(222)
print(113331)
print(5455)
if 1 == 2:
    print(111)
    print(222)
    print(113331)
    print(5455)

1,try ...except  单个情况

2,try except except.....  多分支,针对多个你已知的异常,分别导向不同的代码. *

3,try except Exception as e:  万能异常处理. 你对出现的异常错误未知,你要用万能的. *

    # 1,只是显示错误信息,不终止程序就行. 万能的

    # 2,针对不同的错误,提示不同的信息,进行不同的操作.  多分支,多分支+ 万能

4,try except except except Exception as e:  多分支 + 万能 *

 

5,try  except except... else  出现异常就不执行else代码反之则执行.

6,

    try  except except... else,finally  不常用

    try finally * 涉及到关闭文件句柄,网络链接,数据库链接等等.

7, raise

8, 自定义异常处理.

9 assert

try  except except ...  else  .finally
try finally
posted @ 2018-07-17 13:57  贾迪123  阅读(64)  评论(0编辑  收藏  举报