异常语法
- 捕捉异常可以使用
try/except
语句。
# 需求:尝试以r打开文件,如果有异常以w打开这个文件,最终关闭文件
try:
f = open('test.txt', 'r')
print('可能发⽣生异常的代码')
except Exception as result:
print('如果出现异常执行的代码')
print(result)
else:
print('没有异常执行的代码')
finally:
print('无论是否异常都要执行的代码')
⾃定义异常
- 在Python中,抛出⾃定义异常的语法为 raise 异常类对象 。
# 1. 自定义异常类, 继承Exception, 魔法方法有init和str(设置异常描述信息)
class ShortInputError(Exception):
def __init__(self, length, min_len):
# 用户输入的密码长度
self.length = length
# 系统要求的最少长度
self.min_len = min_len
# 设置异常描述信息
def __str__(self):
return f'您输入的密码长度是{self.length}, 密码不能少于{self.min_len}'
def main():
# 2. 抛出异常: 尝试执行:用户输入密码,如果长度小于3,抛出异常
try:
password = input('请输入密码:')
if len(password) < 3:
# 抛出异常类创建的对象
raise ShortInputError(len(password), 3)
# 3. 捕获该异常
except Exception as result:
print(result)
else:
print('没有异常,密码输入完成')
if __name__ == "__main__":
main()
异常类型
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中所有的异常都是BaseException
的子类型,它有四个直接的子类,分别是:SystemExit
、KeyboardInterrupt
、GeneratorExit
和Exception
。其中,SystemExit
表示解释器请求退出,KeyboardInterrupt
是用户中断程序执行(按下Ctrl+c
),GeneratorExit
表示生成器发生异常通知退出,不理解这些异常没有关系,继续学习就好了。值得一提的是Exception
类,它是常规异常类型的父类型,很多的异常都是直接或间接的继承自Exception
类。如果Python内置的异常类型不能满足应用程序的需要,我们可以自定义异常类型,而自定义的异常类型也应该直接或间接继承自Exception
类,当然还可以根据需要重写或添加方法。
网友评论