我是靠谱客的博主 自信小鸭子,这篇文章主要介绍6.5 Python异常处理、多异常捕捉、异常处理嵌套、自定义引发异常,现在分享给大家,希望可以做个参考。

5、异常处理、多异常捕捉、异常处理嵌套、自定义引发异常

1)异常处理

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
try: f = open('test.txt', 'r', True, 'GBK') print(f.read()) except OSError as e: print(e) print(e.args) # 异常参数 print(e.errno) # 异常编号 print(e.strerror) # 异常描述信息 # 无论正常还是异常,finally 块总会执行,因此通常用于释放资源 finally: if 'f' in globals(): # 当 f 变量存在时,关闭 f 文件流 f.close()
复制代码
1
2
3
4
5
[Errno 2] No such file or directory: 'test.txt' (2, 'No such file or directory') 2 No such file or directory

分析

  • 若需要访问异常信息,用 as 为异常指定一个变量名,否则可省略 as 子句。

2)多异常捕捉

说明:except 块可以捕捉多种类型的异常,将多个异常类用圆括号括起来,中间用逗号隔开(构建多个异常类的元组)

复制代码
1
2
3
4
5
6
7
try: a = int(input('请输入第一个整数:')) b = int(input('请输入第二个整数:')) print(a/b) except (ValueError, ArithmeticError) as e: print(e, type(e))
复制代码
1
2
3
请输入第一个整数:a invalid literal for int() with base 10: 'a' <class 'ValueError'>
复制代码
1
2
3
4
请输入第一个整数:10 请输入第二个整数:0 division by zero <class 'ZeroDivisionError'>

分析:零除异常为算数异常子类

3)异常处理嵌套

说明:在 try 块、except 块或 finally 块中包含完整的异常处理流程的情形被称为异常处理嵌套。

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
f = None try: f = open('data.txt', 'r', True) print(f.read()) except: print('捕捉到异常') finally: if f: # f 不为 None 时关闭文件 try: # 在 finally 块中嵌套了异常处理 f.close() print('关闭文件') except: print('关闭文件时有异常')
复制代码
1
2
3
4
5
第一行 第二行 第三行 关闭文件

4)自定义引发异常:raise

raise 语句三种常用方法

  1. raise:单独的 raise 引发当前捕获到的异常,默认引发 RuntimeError 异常

    复制代码
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    # 要求 age 必须在10到30岁之间 class User: def __init__(self,age=25): if age>30 or age<10: raise # 默认引发 RuntimeError 异常 self.__age = age def setage(self, age): if age>30 or age<10: raise # 默认引发 RuntimeError 异常 self.__age = age def getage(self): return self.__age age = property(fget=getage, fset=setage)
    复制代码
    1
    2
    user = User(40)
    复制代码
    1
    2
    RuntimeError: No active exception to reraise
    复制代码
    1
    2
    3
    user = User() user.age = 40
    复制代码
    1
    2
    RuntimeError: No active exception to reraise
  2. raise 异常类:raise 后带一个异常类,引发指定异常类的默认实例

    复制代码
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    class User: def __init__(self,age=25): if age>30 or age<10: raise ValueError # 引发指定异常类的默认实例 self.__age = age def setage(self, age): if age>30 or age<10: raise ValueError # 引发指定异常类的默认实例 self.__age = age def getage(self): return self.__age age = property(fget=getage, fset=setage) user = User(40)
    复制代码
    1
    2
    ValueError:
  3. raise 异常对象:引发指定的异常对象

    复制代码
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    class User: def __init__(self,age=25): if age>30 or age<10: raise ValueError(age, '年龄必须在10~30之间') # 引发指定的异常对象 self.__age = age def setage(self, age): if age>30 or age<10: raise ValueError(age, '年龄必须在10~30之间') # 引发指定的异常对象 self.__age = age def getage(self): return self.__age age = property(fget=getage, fset=setage) user = User(40)
    复制代码
    1
    2
    ValueError: (40, '年龄必须在10~30之间')

分析:结合异常捕捉使用

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class User: def __init__(self,age=25): if age>30 or age<10: raise ValueError(age, '年龄必须在10~30之间') # 引发指定的异常对象 self.__age = age def setage(self, age): if age>30 or age<10: raise ValueError(age, '年龄必须在10~30之间') # 引发指定的异常对象 self.__age = age def getage(self): return self.__age age = property(fget=getage, fset=setage) user = User(18) print(user.age) print('-'*30) try: user.age = 40 except ValueError as e: print(e.args) # args 即创建异常对象时传入的参数
复制代码
1
2
3
4
18 ------------------------------ (40, '年龄必须在10~30之间')

5)else块

说明:程序不出现异常时,执行 else 块

复制代码
1
2
3
4
5
6
7
8
9
try: a = int(input('请输入第一个整数:')) b = int(input('请输入第二个整数:')) print(a/b) except (ValueError, ArithmeticError) as e: print(e, type(e)) else: print('程序一切正常')
复制代码
1
2
3
4
5
请输入第一个整数:10 请输入第二个整数:2 5.0 程序一切正常

最后

以上就是自信小鸭子最近收集整理的关于6.5 Python异常处理、多异常捕捉、异常处理嵌套、自定义引发异常的全部内容,更多相关6.5内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(98)

评论列表共有 0 条评论

立即
投稿
返回
顶部