1、异常

1 异常捕获常见格式:

'''
try:
    可能会出现异常的代码
except:
    出现了异常,执行的代码
finally:
    无论有没有异常,都会执行的代码

eg1:
    try:
       有可能会出现多种异常---》则需要多个except + 异常类型
    except 类型1:
           print(......)
    except 类型2:
           print(.......)
    except Exception:--->必须放在最后
           pass

eg2:
try:
       有可能会出现多种异常---》则需要多个except + 异常类型
    except 类型1:
           print(......)
    except 类型2:
           print(.......)
    except Exception as err:
           print(err)--->err的内容就是错误的原因

eg3:
   try:
      有可能异常代码
    except 类型1:

    else:
       如果try中没有发生异常,则进入该代码块

注意:如果使用else,则在try中不能出现return


eg4:

文件操作  stream = open(..)   stream.read()/ stream.close()
【1】文件读取错误--》下面代码不会执行,可能文件没有关闭----》任然要关闭内存
【2】 数据库的操作

   try:
    可能会出现异常的代码
except:
    出现了异常,执行的代码
finally:
    无论有没有异常,都会执行的代码

'''

 

2、简单异常报错

# (1) 异常:程序运行时报出的错误: 一般为XXXError,程序异常后面代码都不会运行
'''
def chu(a,b):
    return a / b

x = chu(2,4)

print('x--------------->',x)
'''

# (2) 异常处理
'''
try:
    可能会出现异常的代码
except:
    出现了异常,执行的代码
finally:
    无论有没有异常,都会执行的代码

eg1:
    try:
       有可能会出现多种异常---》则需要多个except + 异常类型
    except 类型1:
           print(......)
    except 类型2:
           print(.......)
           
'''

# (3) 实列
# 可能会遇到输入为字母,或者其他的,导致程序崩溃
'''
def func():
    n1 = int(input('Input first number:'))
    n2 = int(input('Input second number:'))

    sum = n1 + n2
    print('sum: ',sum)

func()
'''


# (4)解决办法
'''
def func():

    try:
       n1 = int(input('Input first number:'))
       n2 = int(input('Input second number:'))

       sum = n1 + n2
       print('sum: ',sum)
    except:
        pass

func()

print('--------------->')
'''
'''
结果所示:
Input first number:s2
--------------->

'''


# (5)
'''
def func():

    try:
       n1 = int(input('Input first number:'))
       n2 = int(input('Input second number:'))

       sum = n1 + n2
       print('sum: ',sum)
    except:
        print('必须输入数字!!!')

func()

print('--------------->')
'''

# (6)当代码比较长,且多个可能会出现异常的代码块时,要定位清晰

def func():
    try:
        n1 = int(input('输入第一个数字:'))    # 这里可能会出错,因为输入字母并不能转换成整型
        n2 = int(input('输入第二个数字:'))

        oper = input('输入运算符号(+ - * /):')

        result = 0
        if oper =='+':
           result = n1+n2
        elif oper =='-':
           result = n1-n2
        elif oper =='*':
            result = n1*n2
        elif oper=='/':
            result = n1/n2            # 这里也有可能会出错,除数不能为0
        else:
            print('符号输入有误!')
        print('结果是:',result)

    except ZeroDivisionError:         # 这个except只接受这个类型的错误,ValueError不匹配的类型
        print('除数不能为0!!')
    except ValueError:
        print('输入的必须是数字')

    # 如果还有异常没有被预知到
    except Exception:
        pass


func()

print('--------------->')



 

3、异常类型

def func():
    try:
        n1 = int(input('输入第一个数字:'))  # 这里可能会出错,因为输入字母并不能转换成整型
        n2 = int(input('输入第二个数字:'))

        oper = input('输入运算符号(+ - * /):')

        result = 0
        if oper == '+':
            result = n1 + n2
        elif oper == '-':
            result = n1 - n2
        elif oper == '*':
            result = n1 * n2
        elif oper == '/':
            result = n1 / n2  # 这里也有可能会出错,除数不能为0
        else:
            print('符号输入有误!')
        print('结果是:', result)

        # 这里进行文件写操作
        # with open(r'c:\p1\aa.txt','w') as wstream:
        #   wstream.write("本次的运算结果是:{}".format(result))

        list1 = []
        list1.pop()

        with open(r'C:\p1\aa.txt','r') as wstream:
            print(wstream.read())

    except ZeroDivisionError:  # 这个except只接受这个类型的错误,ValueError不匹配的类型
        print('除数不能为0!!')
    except ValueError:
        print('输入的必须是数字')

    # except FileNotFoundError:
    #     pass
    # except NameError:
    #     pass

    # 【1】如果还有异常没有被预知到--》异常是按顺序执行的,把这个放最上面
    # 会出现无论什么异常都会报“出错了”

    # 【2】如果5个异常,上面匹配两个,还有3个都被概括为出错了---》现在需要找出每一个出错的原因
    except Exception as err:
        print('出错了!!',err)

# 出错了!! [Errno 2] No such file or directory: 'C:\\p1\\aa.txt'
# 出错了!! pop from empty list

func()

print('--------------->')

 

 

'''
def func():
    try:
        n1 = int(input('输入数字:'))
        print(n1)
        # return 1

    except ValueError:
        print('必须是数字。。。')
        return 2
    else:
        print('输入数字完毕!')  # 没有异常才会执行的代码块

func()
print('--------->')
'''
'''
输入数字:2
2
输入数字完毕!
--------->
'''


def func():
    stream = None
    try:
        stream = open(r'C:\p1\aa.txt')
        container = stream.read()
        print(container)
        return 1
    except Exception as err:
        print(err)
        return 2
    finally:
        print('------finally------>')
        if stream:
           stream.close()

        return 3


# stream 在try块中声明,在finally引用就会有,无法访问--》在前面加一个
x = func()
print(x)

# 返回值为3--》把1覆盖,但是没有finally return的情况下,会返回1

 

5、手动抛出异常

# 抛出异常

# 1、注册用户名必须6位,小于6位则抛出异常
# raise 主动抛出异常

def register():
    username = input('输入用户名: ')
    if len(username)<6:
        raise Exception('用户长度必须6位以上')
    else:
        print('输入的用户名是:',username)

# 2、有异常,需要处理
try:
    register()    # 这是封装好的
except Exception as err:     # 上面运行有异常,except会抓住异常
    print(err)
    print('注册失败!')
else:
    print('注册成功!')
'''
输入用户名: admin
Exception: 用户长度必须6位以上
在开发过程中,只要有一个问题不符合需求,希望主动抛出一个异常--》以这种形式报出异常
'''

'''
输入用户名: admin
用户长度必须6位以上
注册失败!
'''
'''

(1) with 不是用来取代try..except..finally结构的,只是作为补充,方便我们在
    文件管理,网络通信时的开发

(2)with结构可以自动启动上下文管理资源,在with代码执行完毕后自动还原进入,该代码之前的现场或上下文
不论何种原因跳出with块,无论是否异常,总是能保证资源的正常释放----》在文件操作,网络通信常用
'''

'''
# (1)== (2)
try:
    f = open("d:/addd.txt","r")
    container = f.readline()
    print(container)
except:
    print("文件未找到!")
finally:
    print("run in finally!")
    try:
        f.close()
    except BaseException as e:
        print(e)
    

# (2)
with open("d:/addd.txt","r") as f:
    container = f.readline()
    print(container)
print("run in finally!!")
'''

# (3) trackback模块
# (3.1)使用trackback模块打印异常信息---->更加方便(更加全面)
# import traceback
#
# try:
#     print("step1")
#     num = 1/0
# except:
#     traceback.print_exc()    # 打印执行情况

'''
Traceback (most recent call last):
  File "D:/SOFT_PACKAGE/PY/Python/1_Exception/Exception5.py", line 39, in <module>
    num = 1/0
step1
ZeroDivisionError: division by zero
'''

# (3.2)把异常信息打印到文件中

import traceback

try:
    print("step1")
    num = 1/0
except:
    with open(r'C:\p1\a3.txt','w') as f:
        traceback.print_exc( file=f )    # 打印执行情况

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值