Python3-初步认识错误和异常识别
Python 有两种错误很容易辨认:语法错误和异常。
Python assert(断言)用于判断一个表达式,在表达式条件为 false 的时候触发异常。
1. try/expect
单异常处理:
# 一个 try 语句可能包含多个except子句,分别来处理不同的特定的异常。
# 最多只有一个分支会被执行。
while True:
try:
x = int(input("请输入一个数字: "))
break
except ValueError:
print("您输入的不是数字,请再次尝试输入!")
多异常处理:
import sys
try:
f = open('a.txt')
s = f.readline() # 读取首行
print(s)
i = int(s.strip()) # 去除字符串首尾指定字符,默认去除首位空格
print(i)
except OSError as err: # err为异常变量
print("OS error: {0}".format(err))
except ValueError:
print("Could not convert data to an integer.")
except: # try语句无异常时执行
print("Unexpected error:", sys.exc_info()[0])
raise
2. try/except…else
import sys
print(sys.argv[0:])
for arg in sys.argv[0:]:
try:
f = open(arg, 'r')
except IOError:
print('can not open', arg)
else:
print(arg, 'has', len(f.readlines()), 'lines')
f.close()
try:
f = open("b.txt", "r")
except FileNotFoundError:
print('can not open b.txt')
else:
print('b.txt has', len(f.readlines()), 'lines')
f.close()
3. try-finally 语句
如果一个异常在 try 子句里(或者在 except 和 else 子句里)被抛出,而又没有任何的 except 把它截住,那么这个异常会在 finally 子句执行后被抛出。
上述理解: 一个异常由try子句抛出,但是不属于任何一个except异常处理,而else是在try子句没有异常的时候执行,这时异常会在finally子句执行后抛出。
try:
f = open("b.txt", "r")
except FileNotFoundError:
print('can not open b.txt')
else:
print('b.txt has', len(f.readlines()), 'lines')
f.close()
finally:
print('无论有没有异常都会执行。')
4. 抛出异常
抛出异常的格式:raise [Exception [, args [, traceback]]]
# 满足条件,则引发(抛出)异常。
x = 10
if x > 5:
raise Exception('x 不能大于5. x的值为:{}'.format(x))
# 抛出异常但不处理该异常
try:
raise NameError('haha') # 引发异常
except NameError: # 异常名是NameError,就执行以下异常代码
print('xixi') # 异常代码
raise
5. 用户自定义异常
可以通过创建一个新的异常类来拥有自己的异常。
异常类继承自 Exception 类,可以直接继承,或者间接继承。
class myerror(Exception): # Exception是异常基类,myerror是异常派生类
def __init__(self, value):
self.value = value
def __str__(self):
return repr(self.value)
try:
raise myerror(3*3) # 引发异常派生类
except myerror as e: # 异常类myerror的异常代码
print('My exception occurred, value:', e.value)
# 基础类(父类)
class Error(Exception):
pass
# 派生类1(子类)
class InputError(Error):
def __init__(self, expression, message): # expression和message是类内定义的变量
self.expression = expression
self.message = message
# 派生类2(子类)
class TransitionError(Error):
def __init__(self, previous, next, message): # previous、next、message是另一个类内定义的变量
self.previous = previous
self.next = next
self.message = message
本文是从初学者的角度去解释的python中的异常机制,在生产环境中的具体使用需具体分析。