文章目录
异常处理
由问题引发的异常
程序运行过程中,可能会因为数据使用不当导致程序运行出现了错误,引发程序崩溃退出。
所有可能导致程序运行不正常的行为,都称为程序中的异常行为,简称异常!
程序中的异常行为,主要由两类:
- 语法拼写错误:不符合语法规则的拼写,导致程序直接报错;但是这样的错误过于明显,所以不称为异常,直接称为错误!
- 语法规则正确:程序运行期间,由于误操作或者不合法的数据导致程序中的代码报错,这样的报错行为一般情况下称为异常!
- 语法规则正确:程序运行期间没有任何错误,但是运行的结果不符合预期,这样的程序运行逻辑出现的问题不称为异常,而是称为 BUG(缺陷)。如:计算两个数字的和,输入11,12,得到了1112
python中都有什么异常
python语法中提供了自己的异常体系,可以很方便的描述大部分情况下遇到的各种异常情况,所有的异常都是从 BaseException 直接或者间接继承而来的!
BaseException
+-- SystemExit
+-- KeyboardInterrupt
+-- GeneratorExit
+-- Exception
+-- StopIteration
+-- StopAsyncIteration
+-- ArithmeticError
| +-- FloatingPointError
| +-- OverflowError
| +-- ZeroDivisionError
+-- AssertionError
+-- AttributeError
+-- BufferError
+-- EOFError
+-- ImportError
| +-- ModuleNotFoundError
+-- LookupError
| +-- IndexError
| +-- KeyError
+-- MemoryError
+-- NameError
| +-- UnboundLocalError
+-- OSError
| +-- BlockingIOError
| +-- ChildProcessError
| +-- ConnectionError
| | +-- BrokenPipeError
| | +-- ConnectionAbortedError
| | +-- ConnectionRefusedError
| | +-- ConnectionResetError
| +-- FileExistsError
| +-- FileNotFoundError
| +-- InterruptedError
| +-- IsADirectoryError
| +-- NotADirectoryError
| +-- PermissionError
| +-- ProcessLookupError
| +-- TimeoutError
+-- ReferenceError
+-- RuntimeError
| +-- NotImplementedError
| +-- RecursionError
+-- SyntaxError
| +-- IndentationError
| +-- TabError
+-- SystemError
+-- TypeError
+-- ValueError
| +-- UnicodeError
| +-- UnicodeDecodeError
| +-- UnicodeEncodeError
| +-- UnicodeTranslateError
+-- Warning
+-- DeprecationWarning
+-- PendingDeprecationWarning
+-- RuntimeWarning
+-- SyntaxWarning
+-- UserWarning
+-- FutureWarning
+-- ImportWarning
+-- UnicodeWarning
+-- BytesWarning
+-- ResourceWarning
什么是异常?
异常是程序中的所有不正常的行为,导致程序报错乃至崩溃退出的错误。
常见的异常(广义)按照报错情况分为两种:错误[语法错误],异常[运行异常,侠义]
python中的异常体系
通过语法规则,给程序中所有的不正常行为进行命名,方便精确处理,如下标越界异常,类型转换异常等等。python 语法规则中定义了异常的超类(BaseException),让所有可能发生的各种异常直接或者间接继承自该类型,方便所有异常的统一管理。
异常处理的基本语法
Python针对异常体系,提供了标准的,固定的处理语法
try:
可能出现异常的代码块
except 具体异常 as e:
处理异常的代码
[else]:
未出现异常时执行的代码块
[finally]:
不论是否出现异常,都会执行的代码块
处理单个异常
try:
# 当用户误操作输入非数字时可能触发 ValueError
pay = float(input("请输入支付金额:"))
print(f"用户支付了{pay}元")
except ValueError as e:
print("出现了异常")
print("您的输入有误!")
处理多个异常
多个 try…except 语句
try:
pay = float(input("请输入支付金额:"))
prinf("hello")
except ValueError as e:
print("您的输入有误")
try:
pay = float(input("请输入支付金额:"))
prinf("hello")
except NameError as e:
print("prinf is not defined")
堆叠 except语句
try:
pay = float(input("请输入支付金额:"))
prinf("hello")
except ValueError as e:
print("您的输入有误")
except NameError as e:
print("prinf is not defined")
模糊处理多个异常
try:
pay = float(input("请输入支付金额:"))
prinf("hello")
except (ValueError,NameError) as e:
print("上述出现了异常!")
处理所有异常
由于所有的异常都是直接或者间接继承自 BaseException,所以可以通过处理定义顶级异常类 BaseException 完成所有异常的处理
try:
可能出现异常的代码块
except BaseException as e:
print("发生异常,", e)
简化语法
try:
可能出现异常的代码块
except:
print("出现了异常")
自定义异常和抛出异常
项目开发过程中,由于项目场景千变万化,python中提供的异常体系并不能完全描述项目中可能出现的所有异常,我们就需要对系统中的异常进行扩展
自定义异常
自定义异常类,继承自 BaseException,异常类的名称和项目中业务逻辑紧密相关
class UserInputError(BaseException):
def __init__(self):
self.msg = "用户输入了错误的选项"
def __str__(self):
return self.msg
**自定义异常的作用:**将系统中的异常信息,转换为和业务逻辑紧密相关的异常信息。
**异常的数据转换:**需要在出现异常的地方,将自定义异常抛出给调用者!
抛出异常
基本语法: raise 异常对象
try:
pay = float(input("请输入支付金额:"))
except ValueError as e:
# 抛出自定义异常对象
raise UserInputError()
# 执行结果
# UserInputError: 用户输入了错误的选项
抛出自定义异常,实现了异常信息的转换过程,给用户一个更加明确的异常信息!