Python基础之异常
本节将介绍异常的基本概念,语法,异常类结构,自定义异常以及主动抛出异常等内容。
异常是指程序遇到错误导致无法继续执行时突然中止的一种现象。比如,两个数相除,如果除数为0,程序将无法继续执行,如果此时没有显示的指定如果处理,那么程序将强制退出。Python中的异常相对Java的要简单一些,没有运行时异常和非运行时异常之分。
语法
异常的语法通过 try,except,else,finally 等关键字来定义。例如:
try:
pass
except ZeroDivisionError as e:
pass
except (ValueError, ArithmeticError) as e:
pass
else:
pass
finally:
pass
在except子句中可以跟一个或多个异常类,表示如果try中的语句出现了给定的异常,程序将进入相应的except子句中。else定义在没有任何异常情况下将执行的语句,finally定义无论是否出现异常始终都要执行的语句。例如:
def divide(num1, num2):
result = 0
try:
result = num1 / num2
except ZeroDivisionError as e:
print("ZeroDivisionError happened, %r" % e)
except Exception as e:
print("Exception happened, %r" % e)
else:
print("No error happened.")
finally:
print("Finally statement.")
return result
print(divide(4, 2))
print()
print(divide(4, 0))
print()
print(divide(4, 'abc'))
运行结果:
D:\work\python_workspace\python_study\venv\Scripts\python.exe D:/work/python_workspace/python_study/basic_07/except_2.py
No error happened.
Finally statement.
2.0
ZeroDivisionError happened, ZeroDivisionError('division by zero')
Finally statement.
0
Exception happened, TypeError("unsupported operand type(s) for /: 'int' and 'str'")
Finally statement.
0
Process finished with exit code 0
异常类结构
本节引用自 https://blog.csdn.net/gaoxin12345679/article/details/47017483?utm_source=blogxgwz7, 并做了一些修改和补充。
BaseException 所有内建异常的基类,继承自object类
+-- SystemExit 由sys.exit()函数引发。当它不处理时,Python 解释器退出
+-- KeyboardInterrupt 当用户点击中断键 (通常ctrl + C) 时引发
+-- GeneratorExit 当调用一种generator的close()方法时引发。它直接继承BaseException而不是Exception,因为它是从技术上讲不是一个错误。
+-- Exception 所有内置的,非系统退出异常是从该类派生的。应该从该类派生所有用户定义的异常。
+-- StopIteration
+-- ArithmeticError 算数类异常
| +-- FloatingPointError 浮点数异常
| +-- OverflowError
| +-- ZeroDivisionError 除数为0异常
+-- AssertionError
+-- AttributeError
+-- BufferError 当缓冲区相关的操作无法执行时引发
+-- EOFError 当input()函数在文件尾(EOF)的条件下没有读到任何数据时被引发
+-- ImportError 当import语句无法找到模块定义时引发
+-- LookupError 当用于映射或序列的键或索引无效时引发
| +-- IndexError
| +-- KeyError
+-- MemoryError 当OOM时被引发,但是其状态仍然能被拯救
+-- NameError 当一个局部或者全局的名字没有找到时被引发
| +-- UnboundLocalError
+-- OSError 当一个系统函数返回一个与系统相关的错误时引发。
| +-- BlockingIOError
| +-- ChildProcessError
| +-- ConnectionError
| | +-- BrokenPipeError
| | +-- ConnectionAbortedError
| | +-- ConnectionRefusedError
| | +-- ConnectionResetError
| +-- FileExistsError
| +-- FileNotFoundError
| +-- InterruptedError
| +-- IsADirectoryError
| +-- NotADirectoryError
| +-- PermissionError
| +-- ProcessLookupError
| +-- TimeoutError
+-- ReferenceError 当访问一个已经被GC的对象时被引发
+-- RuntimeError 当一个错误不能被其他所有的错误检测到时被引发
| +-- NotImplementedError
+-- SyntaxError 当解析器遇到语法错误时引发。非运行时错误。
| +-- IndentationError
| +-- TabError
+-- SystemError 当解释器发现一个内部错误时引发
+-- TypeError 当一个操作符或者函数应用到一个不合适的对象时引发
+-- ValueError 当一个内置操作符或函数接收到一个类型正确但是值不合适的时候被引发
| +-- UnicodeError
| +-- UnicodeDecodeError
| +-- UnicodeEncodeError
| +-- UnicodeTranslateError
+-- Warning
+-- DeprecationWarning
+-- PendingDeprecationWarning
+-- RuntimeWarning
+-- SyntaxWarning
+-- UserWarning
+-- FutureWarning
+-- ImportWarning
+-- UnicodeWarning
+-- BytesWarning
+-- ResourceWarning
自定义异常类和抛出异常
可创建一个自定义的异常类,一般情况下自定义异常类都应该继承自Exception类。可通过关键字raise主动抛出一个异常,让外层来处理此异常。例如:
class MyError(Exception):
pass
try:
print("Before raise error.")
raise MyError('This is a testing error.')
print("After raise error.")
except MyError as e:
print("MyError occurred, %r" % e)
finally:
print("Finally statement.")
运行结果:
D:\work\python_workspace\python_study\venv\Scripts\python.exe D:/work/python_workspace/python_study/basic_07/my_exception.py
Before raise error.
MyError occurred, MyError('This is a testing error.')
Finally statement.
Process finished with exit code 0