Python--异常处理机制

一、什么是异常?
Error(错误)是系统中的错误,程序员是不能改变的和处理的,如系统崩溃,内存空 间不足,方法调用栈溢等。遇到这样的错误,建议让程序终止。
Exception(异常)表示程序可以处理的异常,可以捕获且可能恢复。遇到这类异常, 应该尽可能处理异常,使程序恢复运行,而不应该随意终止异常。
常见的异常:
AttributeError 、IOError 、ImportError 、IndexError、SyntaxError、TypeError、ValueError、KeyError、NameError
• IndentationError: 缩进错误
• KeyboardInterrupt: Ctrl+C被按下
• UnboundLocalError : 有同名的全局变量

1.
# print(a)   
# NameError
 
2.
# print(10/0) 
# ZeroDivisionError (除0错误)
3.
# 索引异常: IndexError
# str = 'hello'
# print(str[6])
4.
# 字典key值错误: KeyError
# d = dict(a=1, b=2)
# 如果key值不存在, 返回None;
# print(d.get('c'))
# print(d.get('c', "key不存在"))
# # print(d['c'])
5.
# 缩进异常: IndentationError
# age = 18
# if age > 18:
#                     print('adult')
# else:
#     print("not adult")
#         print('dhchfdhvf')

二、异常处理机制

Python--异常处理机制_第1张图片
Python 的异常机制主要依赖 try 、except 、else、finally 和 raise 五个关键字。
• try 关键字后缩进的代码块简称 try 块,它里面放置的是可能引发异常的代码;
• except 关键字对应异常类型和处理该异常的代码块;
• 多个 except 块之后可以放一个 else 块,表明程序不出现异常时还要执行 else 块;
• finally 块用于回收在 try 块里打开的物理资源,异常机制会保证 finally 块总被执行;
• raise 用于引发一个实际的异常,raise 可以单独作为语句使用,引发一个具体的异常对象;
try的工作原理是,当开始一个try语句后,python就在当前程序的上下文中作标记,这样当异常出现时就可以回到这里,try子句先执行,接下来会发生什么依赖于执行时是否出现异常。
案例:

try:
    # try里面写的是要执行的代码;
    print(a)
    print(10/0)
    # 此处不会打印westos, 因为上一行代码执行报错;
    print('westos')
except NameError:
    # try里面的代码如果有异常/错误, 才会执行的代码;
    # except NameError:, 只对NmaeError错误进行处理;
    print("错误")
else:
    # 判断是否有异常, 如果没有, 执行此代码;
    print("运行成功")
finally:
    # 有异常和没有异常都会执行的代码;
    print("检测finally的作用")
import sys
 
try:
    10/0
    f = open('passwd')
    s = f.readline()
    i = int(s.strip())
except OSError as err:
    print("OS error: {0}".format(err))
except ValueError:
    print("Could not convert data to an integer.")
except:
    # sys.exc_info(): 获取异常信息
    print(sys.exc_info())
    print("Unexpected error:", sys.exc_info()[0])
    # 抛出异常, 本来可以正确执行的代码让报错;
    raise

这里用到一个raise 它可以抛出异常,使处理了的异常报出错误,下面会在触发异常中详细介绍。
除了处理实际的错误条件之外,对于异常还有许多其它的用处。在标准 Python 库中 一个普通的用法就是试着导入一个模块,然后检查是否它能使用。导入一个并不存在的 模块将引发一个 ImportError 异常。
三、触发异常
Python 允许程序自行引发异常,自行引发异常使用 raise 语句来完成。
raise语句中 Exception 是异常的类型(例如,NameError)参数标准异常中任一种, args 是自已提供的异常参数
raise [Exception [, args [, traceback]]]
案例:

# 录入学生信息的系统;
# 对录入的信息进行校验: 1). len(姓名)>2  2). 0
 
name = input("姓名:")
if len(name) < 2:
    raise NameError("姓名必须大于2位")
age = int(input("年龄:"))
if age < 0 or age >= 150:
    raise NameError("年龄必须在0)

四、自定义异常
用户自定义异常都应该继承 Exception 基类或 Exception 的子类,在自定义异常类时基 本不需要书写更多的代码,只要指定自定义异常类的父类即可。
Python 异常使用规范:
• 不要过度使用异常
• 不要使用过于庞大的 try 块
• 不要忽略捕获到的异常

class AgeError(ValueError):
    pass
age = 1000
if 0 < age < 150:
    print('age legal')
else:
    raise AgeError('age error')

结果如下:
在这里插入图片描述

你可能感兴趣的:(Python,基本数据类型与高级特性)