目录
1. 常见异常类:
2.异常处理
try 语句按照如下方式工作;
finally的应用思路举例:
3. 抛出异常
?
?4.断言 assert:
5.自定义异常
?
?
1. 常见异常类:
? ?1)NameError:使用未定义变量 ? ?2)ZeroDivisionError:分母为零 ? ?3)SyntaxError:语法错误 ? ?4)IndexError:索引超出范围 ? ?5)KeyError:引用的字典键值错误 ? ?6)FileNotFoundError:找不到文件 ? ?7)AttributeError:类中没有属性 ? ?8)AssertionError:断言异常?
>>> 10 * (1/0) # 0 不能作为除数,触发异常
Traceback (most recent call last):
File "<stdin>", line 1, in ?
ZeroDivisionError: division by zero
>>> 4 + spam*3 # spam 未定义,触发异常
Traceback (most recent call last):
File "<stdin>", line 1, in ?
NameError: name 'spam' is not defined
>>> '2' + 2 # int 不能与 str 相加,触发异常
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: can only concatenate str (not "int") to str
2.异常处理
a = [1,2,3]
print(a[6]) #如何避免此处的异常影响全局
print('zard')
"""
pydev_imports.execfile(filename, global_vars, local_vars) # execute the script
File "D:\pycharm2020\PyCharm 2020.1\plugins\python\helpers\pydev\_pydev_imps\_pydev_execfile.py", line 18, in execfile
exec(compile(contents+"\n", file, 'exec'), glob, loc)
File "D:/python_files/python_fiew/do_yicahng_01.py", line 2, in <module>
print(a[6])
IndexError: list index out of range
"""
?
try 语句按照如下方式工作;
-
首先,执行 try 子句(在关键字 try 和关键字 except 之间的语句)。 -
如果没有异常发生,忽略 except 子句,try 子句执行后结束。 -
如果在执行 try 子句的过程中发生了异常,那么 try 子句余下的部分将被忽略。如果异常的类型和 except 之后的名称相符,那么对应的 except 子句将被执行。 -
如果一个异常没有与任何的 except 匹配,那么这个异常将会传递给上层的 try 中。
? ? ? ?一个 try 语句可能包含多个except子句,分别来处理不同的特定的异常。最多只有一个分支会被执行。
? ? ?处理程序将只针对对应的 try 子句中的异常进行处理,而不是其他的 try 的处理程序中的异常。
number = int(input("请输入您要检索的索引数字:"))
a = [1,2,3]
try:
print(a[number])
except: #捕获异常
print("存在异常时,此句会被执行!")
else:
print('无异常,故此句会被执行。')
finally:
print("无论是否有异常,此句都会被执行!")
print('zard')
"""
PyDev console: starting.
Python 3.7.0 (default, Jun 28 2018, 08:04:48) [MSC v.1912 64 bit (AMD64)] on win32
runfile('D:/python_files/python_fiew/do_yicahng_01.py', wdir='D:/python_files/python_fiew')
请输入您要检索的索引数字:>? 6
存在异常时,此句会被执行!
无论是否有异常,此句都会被执行!
zard
"""
一个except子句可以同时处理多个异常,这些异常将被放在一个括号里成为一个元组,例如:?
except (RuntimeError, TypeError, NameError):
pass
要能捕获所有异常,且可以打印出对应异常的信息,则利用所有异常的父类Exception:?
number = 6
a = [1,2,3]
try:
print(a[number])
except Exception as e: #捕获异常,将Exception命名为e
print(e) #打印异常信息
else:
print('无异常,故此句会被执行。')
finally:
print("无论是否有异常,此句都会被执行!")
print('zard')
number = 6
a = [1,2,3]
try:
print(a[number])
except Exception as e: #捕获异常,将Exception命名为e
print('Exception') #打印异常信息
except IndexError as i:
print('IndexError')
finally:
print("无论是否有异常,此句都会被执行!")
print('zard')
"""
PyDev console: starting.
Python 3.7.0 (default, Jun 28 2018, 08:04:48) [MSC v.1912 64 bit (AMD64)] on win32
runfile('D:/python_files/python_fiew/do_yicahng_01.py', wdir='D:/python_files/python_fiew')
Exception
无论是否有异常,此句都会被执行!
zard
"""
number = 6
a = [1,2,3]
try:
print(a[number])
except IndexError as i:
print('IndexError')
except Exception as e: #捕获异常,将Exception命名为e
print('Exception') #打印异常信息
finally:
print("无论是否有异常,此句都会被执行!")
print('zard')
finally的应用思路举例:
a = [1,2,3]
try:
f = open('file.log')
print(a[6])
except Exception as fnf_error:
print(fnf_error)
finally:
f.close() #finally可用于释放文件操作
3. 抛出异常
def asd(age):
if age < 0 or age >200:
raise Exception("年龄太大或太小")
print(age)
try:
asd(231)
except: #捕获异常
pass
?4.断言 assert:
其优点在于将上述的抛出异常和捕获异常操作变成一步:
age = 0
assert age < 0 or age > 200,"年龄不合法"
5.自定义异常
#自定义异常
#在继承父类Exception的基础上再自定义异常。相当于往Exception中添加新的异常
class AgeError(Exception):
def __init__(self,info):
self.info = info
def show(self):
print(self.info)
ageError = AgeError("年龄异常!") #实例化
age = -1
if age < 0:
raise ageError
|