异常是指运行期检测到的错误。大多数的异常都不会被程序处理,都以错误信息的形式展现。
在程序中给程序添加异常,可以使程序更加健壮。
具体语法如下:
try:
语句
except 错误类型1:
处理语句
except 错误类型2:
处理语句
读取方式如下:
先执行try语句,如果无异常,则忽略except语句;如果在执行过程中发现异常,则忽略异常语句一下的部分,去执行except语句部分,然后执行try语句之后的代码。
例:
def test():
try:
bcs=int(input('please input bcs:'))
cs=int(input('please input cs:'))
s=bcs/cs
return
except ZeroDivisionError:
print('cs cannot be zero!')
test()
输出结果:
please input bcs:1
please input cs:0
cs cannot be zero!
一个 try 语句可能包含多个except子句,分别来处理不同的特定的异常。最多只有一个分支会被执行。
例:
try:
a=1/0
print(a)
except TypeError:
print('TypeError')
except ZeroDivisionError:
print('ZeroDivisionError')
except Exception: #Exception是常规错误的父类
print('Exception')
输出结果:
ZeroDivisionError
注:在写错误类型的时候,一般把Exception放在最后,其子类异常类型放在前面,这样可以具体提示用户发生了什么错误。
一个except子句可以同时处理多个异常,这些异常将被放在一个括号里成为一个元组。
常用异常类型如下:
异常名称 | 描述 |
---|---|
BaseException | 所有异常的基类 |
SystemExit | 解释器请求退出 |
KeyboardInterrupt | 用户中断执行(通常是输入^C) |
Exception | 常规错误的基类 |
StopIteration | 迭代器没有更多的值 |
GeneratorExit | 生成器(generator)发生异常来通知退出 |
StandardError | 所有的内建标准异常的基类 |
ArithmeticError | 所有数值计算错误的基类 |
FloatingPointError | 浮点计算错误 |
OverflowError | 数值运算超出最大限制 |
ZeroDivisionError | 除(或取模)零 (所有数据类型) |
AssertionError | 断言语句失败 |
AttributeError | 对象没有这个属性 |
EOFError | 没有内建输入,到达EOF 标记 |
EnvironmentError | 操作系统错误的基类 |
IOError | 输入/输出操作失败 |
OSError | 操作系统错误 |
WindowsError | 系统调用失败 |
ImportError | 导入模块/对象失败 |
LookupError | 无效数据查询的基类 |
IndexError | 序列中没有此索引(index) |
KeyError | 映射中没有这个键 |
MemoryError | 内存溢出错误(对于Python 解释器不是致命的) |
NameError | 未声明/初始化对象 (没有属性) |
UnboundLocalError | 访问未初始化的本地变量 |
ReferenceError | 弱引用(Weak reference)试图访问已经垃圾回收了的对象 |
RuntimeError | 一般的运行时错误 |
NotImplementedError | 尚未实现的方法 |
SyntaxError | Python 语法错误 |
IndentationError | 缩进错误 |
TabError | Tab 和空格混用 |
SystemError | 一般的解释器系统错误 |
TypeError | 对类型无效的操作 |
ValueError | 传入无效的参数 |
UnicodeError | Unicode 相关的错误 |
UnicodeDecodeError | Unicode 解码时的错误 |
UnicodeEncodeError | Unicode 编码时错误 |
UnicodeTranslateError | Unicode 转换时错误 |
Warning | 警告的基类 |
DeprecationWarning | 关于被弃用的特征的警告 |
FutureWarning | 关于构造将来语义会有改变的警告 |
OverflowWarning | 旧的关于自动提升为长整型(long)的警告 |
PendingDeprecationWarning | 关于特性将会被废弃的警告 |
RuntimeWarning | 可疑的运行时行为(runtime behavior)的警告 |
SyntaxWarning | 可疑的语法的警告 |
UserWarning | 用户代码生成的警告 |
try except语句后还可接else,else语句是在没有发生异常时执行。要放在except后面。
finally语句:无论前面如何,最终都要被执行的语句。
例:
def list(arr):
arr[len(arr)]
def finderror(arr):
try:
list(arr)
except Exception as ex: #as是将Exception实例化
print(ex)
finally:
print('all over')
a=[1,23,4,5,6,77,8]
finderror(a)
输出结果:
list index out of range
all over
抛出异常:
可以使用raise语句来跑出一个指定的异常,一般用于用户名、密码错误。
用户自定义异常:
用户可以创建一个新的异常类,来满足自己的需求。自定义异常类通常继承自Exception类。
例:
class ageException(Exception):
pass
def doage():
age=int(input('please input the age:'))
if age<0 or age>100:
raise ageException('please input the right number!')
try:
doage()
except ageException as ag:
print(ag)
输出结果:
please input the age:111
please input the right number!
日志输出:
日志输出可以帮我们更方便的检测程序运行状态。在python里可以调用logging模块。
例:
import logging
LOG_FORMAT='%(asctime)s %(filename)s %(message)s'
logging.basicConfig(filename='a.txt',level=logging.DEBUG,format=LOG_FORMAT)
def test():
try:
bcs=int(input('please input bcs:'))
cs = int(input('please input cs:'))
print(bcs/cs)
return
except ValueError:
logging.debug("只能输入数字!")
except ZeroDivisionError:
logging.info("除数不能为0")
else:
print("else...")
finally:
print("程序结束")
test()
在执行程序后,系统会在文件同级目录下创建一个a.txt文件,并记录异常信息,当然也只记录异常信息。
日志级别:
日志级别有如下几种。当获取根Logger的时候,默认级别为NOTSET,这样会显示所有输出。当获取非根Logger的时候,根Logger的默认级别是WARNING,非根Logger会继承这个级别,只有WARNING以上的日志才会输出。
级别 | 数值 |
---|---|
CRITICAL | 50 |
ERROR | 40 |
WARNING | 30 |
INFO | 20 |
DEBUG | 10 |
NOTSET | 0 |