一、常见的内置异常
print(name)
# # NameError: name 'name' is not defined
print(int('100a'))
# # ValueError: invalid literal for int() with base 10: '100a'
print('hello' + 1234)
# TypeError: can only concatenate str (not "int") to str
还有:IndexError,IndentationError,AttributeError,ZeroDivisionError。。。
二、内置异常处理
使用关键字 try except finally else 组合成不同的处理方式,其中 try 和 except 是核心。
# 内置异常处理:简单模式
语法格式:
try:
代码1
except:
代码2
# 内置异常处理:捕获多个异常结构
语法格式:
try:
代码1
except XXX:
代码2
except XXX:
代码3
except XXX:
代码4
# 内置异常处理:try... except... else 结构
语法格式:
try:
代码1
except XXX:
代码2
else:
代码3
# 内置异常处理:try... except... else... finally 结构
语法格式:
try:
代码1
except:
代码2
else:
代码3
finally:
代码4
三、自定义异常
raise 可以手动抛出异常(内置异常或者自定义异常都可以)。
def sub(a, b):
if a < b:
raise Exception('被减数不能小于减数')
else:
return a - b
try:
print(sub(3, 10))
except Exception as e:
print(e)
#【运行结果】:
# 被减数不能小于减数
自定义异常,必须继承Exception类。
# 自定义异常的语法格式
class MyException(BaseException):
def __init__(self, msg):
self.msg = msg
def __str__(self):
return self.msg
try:
raise MyException('异常消息字符串')
except MyException as e:
print(e)
四、示例A
# 编写一个函数,接收两个参数 a 和 b,其中 a 和 b 都是数字;
# 要求:返回 a/b 的结果。
# 如果 b为0,则抛出一个自定义的异常“ZeroDivisionError”。
class ZeroDivisionError(BaseException):
def __init__(self, msg):
self.msg = msg
def __str__(self):
return self.msg
def func(a:int, b:int):
if b == 0:
raise ZeroDivisionError("除数不能为0")
else:
return a/b
try:
print(func(9, 3))
print(func(9, 0))
except ZeroDivisionError as e:
print(e)
#【运行结果】:
# 3.0
# 除数不能为0
五、示例B(日志的简单应用)
Python中,记录日志使用 logging 库,日志的级别从高到低分别为:
(1)CRITICAL:系统崩溃级别的错误,必须立即处理;
(2)ERROR:运行时的错误,可能导致程序无法正常运行;
(3)WARNING:警告信息;
(4)INFO:信息性消息,程序正常运行;
(5)DEBUG:详细信息,通常在诊断问题时有用;
import logging
# 设置日志的打印级别
logging.basicConfig(level=logging.DEBUG)
logging.critical('\t这是一个 critical 信息')
logging.error('\t这是一个 error 信息')
logging.warning('\t这是一个 warning 信息')
logging.info('\t这是一个 info 信息')
logging.debug('\t这是一个 debug 信息')
#【运行结果】:
# CRITICAL:root: 这是一个 critical 信息
# ERROR:root: 这是一个 error 信息
# WARNING:root: 这是一个 warning 信息
# INFO:root: 这是一个 info 信息
# DEBUG:root: 这是一个 debug 信息