Python-17-异常

异常

一、了解异常

当程序执行之后,解释器会检测程序中是否有错误,如果遇到错误,解释器会给出错误类型错误信息,这个类型和信息在Python中叫做”异常

异常的特点:当出现之后,解释器立即停止解释,异常代码之后的代码不会执行。在工程中,即使代码报错,也需要执行后续代码,这时就需要对异常进行处理,处理过程叫做”捕获异常

n1 = int(input('请输入一个整数:'))             # 可能报错的代码'1.1' 不能转int类型
print('asdfasdfasd')
print(1 / n1)           # 可能报错。ZeroDivisionError: division by zero

二、异常的使用

2.1 简单体验

  • 语法
try:
	可能报错的代码
except:
    出现异常之后需要做的处理
  • 代码演示
try:
	print(1 / 0)			# 一定会报错
except:
    print('出现异常之后进行处理')

2.2 捕获指定异常

2.2.1 捕获单个异常
  • 语法
try:
    可能出现异常的代码
except 指定异常的类型:
    对异常进行处理    
  • 代码
try:
    int(input('请输入整数:'))		# 异常类型:ValueError
    print(1 / 0)            		# 异常类型:ZeroDivisionError
except ValueError:      # 表示捕获指定的异常,如果try抛出的异常不在except之后定义,则捕获失败
    print('处理异常')
print('后续代码')
2.2.2 捕获多个指定异常
  • 语法
try:
    可能出现异常的代码
except (异常类型1, 异常类型2, ...,异常类型n):
    对异常进行处理  
  • 代码
try:
    n = int(input('请输入整数:'))
    print(1 / n)            				# ZeroDivisionError
except (ValueError, ZeroDivisionError):      # 表示捕获指定的异常,如果try抛出的异常不在except之后定义, 则捕获失败
    print('处理异常')
print('后续代码')
2.2.3 查看异常信息
  • 语法
try:
    可能出现异常的代码
except 异常类型 as 异常信息:
    对异常进行处理
  • 代码
try:
    print(1 / 0)
except ZeroDivisionError as e:          # 将异常信息保存变量e中
    print(e)
2.2.4 捕获Exception异常
  • 语法
try:
    可能出现异常的代码
except Exception as e:			# Exception是代码级异常的基类
    处理异常
  • 代码
try:
    n = int(input('请输入整数:'))
    print(1 / n)
except Exception as e:          # 将异常信息保存变量e中
    print(e)

通过Exception来捕获所有代码级的异常。

2.2.5 捕获BaseException异常
  • 语法
try:
    可能出现异常的代码
except BaseException as e:			# BaseException表示所有异常的基类
    处理异常
  • 代码
import time

try:
    time.sleep(10)
except BaseException as e:          # 将异常信息保存变量e中
    print(e)

2.3 else

try中的代码没有出现异常,则执行else中的代码

  • 语法
try:
    可能出现异常的代码
except:
    处理异常
else:
    没有异常时执行的代码
  • 代码
try:
    f = open('test.txt')
except Exception as e:
    print('except')
    f = open('test.txt', 'w')
    f.write('adsfsadf')
else:
    print('else')
    print(f.read())
f.close()

2.4 finally

无论是否出现异常,都会执行finally中的代码,一般用于关闭数据库连接、数据库的事务提交

  • 语法
try:
    f = open('test.txt')
except Exception as e:
    print('except')
    f = open('test.txt', 'w')
    f.write('ABC')
else:
    print('else')
    print(f.read())
finally:
    print('finally')
    f.close()

三、异常的传递

  • 函数调用时的异常处理
def func1():
    print('异常代码之前')
    print(1 / 0)
    print('异常代码之后')

def func2():
    print('调用func1之前')
    func1()
    print('调用func1之后')


# 第一种:在调用处处理异常
def func1():
    print('异常代码之前')
    print(1 / 0)
    print('异常代码之后')


def func2():
    print('调用func1之前')
    try:
    	func1()
    except:
        pass
    print('调用func1之后')


# 第二种:在异常源码处处理
def func1():
    print('异常代码之前')
    try:
        print(1 / 0)
    except:
        pass
    print('异常代码之后')


def func2():
    print('调用func1之前')
    func1()
    print('调用func1之后')
  • try的嵌套
import time

try:
    f = open('test.txt')
    try:
        time.sleep(10)
    except BaseException as e:			# 当处理完异常,不会异常传递到外层的try
        print('系统中断', e)
except:
    print('文件不存在!')
else:
    print('未出现异常')
print('程序结束')

四、自定义异常

4.1 自定义异常的步骤

  • 创建异常类:
  1. 创建一个异常类,这个类必须继承常用错误的基类Exception
  2. 创建一个__str__,通过这个方法return异常信息
  • 抛出异常:raise 自定义异常的实例对象
# 自定义异常类
class MyError(Exception):
    def __str__(self):
        return '异常信息'

# 抛出自定义异常
raise MyError()

4.2 案例

""" 练习:
1. 提示用户输入一个整数,
2. 如果输入的是奇数,则抛出异常
3. 处理这个异常
"""

class MyError(Exception):
    def __init__(self, n):
        self.n = n

    def __str__(self):
        # 你输入的是xxxx,它是一个奇数
        return f'你输入的是{self.n},它是一个奇数!'

try:
    num_ = int(input('请输入一个偶数:'))
    if num_ % 2:        # 如果num_为奇数,则抛出异常
        raise MyError(num_)
except Exception as e:
    print(e)
else:
    print('输入正确')
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值