用try...except处理异常
Python语言提供了try...except语句块专门用来处理异常。
Python语言中定义了很多异常情况,每种异常情况是一个类(对象)。Exception异常类是顶层异常,能表示任何异常。其他异常是细分异常。
用try...except处理异常
还是以上一节中除法函数为例,程序代码如下。
# 定义除法函数
def divi(x,y):
try:
if x>y:
z=x/y
return z
except:
print("调用者,你太大意了,不能做除法,有异常请检查")
res=divi(6,2) # 正常
print(res)
res=divi(6,0) # 异常
print(res)
res=divi(6,"2") # 异常
print(res)
res=divi(6,"abcd") # 异常
print(res)
运行结果
C:UsershccmaAnaconda3python.exe E:/wkp01/p00/test01/atestpkg/t27.py
3.0
调用者,你太大意了,不能做除法,有异常请检查
None
调用者,你太大意了,不能做除法,有异常请检查
None
调用者,你太大意了,不能做除法,有异常请检查
None
Process finished with exit code 0
从上面程序可以看出,一个try...except能顶千万条if...else。
多行except处理细分类异常
在前面小节里我们遇到了几个异常,其中有ZeroDivisionError和TypeError异常,它们都是Exception异常的子类,相当于细分类异常。
except默认获取Exception异常,总异常,没有细分类。
多行except处理细分异常代码如下。
# 定义除法函数
def divi(x,y):
try:
if x>y:
z=x/y
return z
except ZeroDivisionError as e:
print("调用者,你太大意了,有异常请检查,分母为0")
except TypeError as e:
print("调用者,你太大意了,有异常请检查,类型不对")
res=divi(6,2)
print(res)
res=divi(6,0)
print(res)
res=divi(6,"2")
print(res)
res=divi(6,"abcd")
print(res)
运行结果
C:UsershccmaAnaconda3python.exe E:/wkp01/p00/test01/atestpkg/t28.py
3.0
调用者,你太大意了,有异常请检查,分母为0
None
调用者,你太大意了,有异常请检查,类型不对
None
调用者,你太大意了,有异常请检查,类型不对
None
Process finished with exit code 0
不同异常处理方式不同,所以异常需要分类处理。而且,如果不对异常分类判断,那么程序会对所有异常进行判断,这样也会影响程序效率。
也可以把几种异常写在一起,缩小异常判断范围。
except (ZeroDivisionError,TypeError)
用try...except...finally处理异常
处理异常的语句快还有else和finally,构成的整体结构有。
- try...except
- try...except...else
- try...except...finally
- try...except...else...finally
else语句块表示没有捕获到异常,即没有执行except块内的语句时执行。
finally语句块表示不管是执行try还是except等,总会执行finally语句块内程序。finally可以用于关闭某些资源,比如数据库连接等。
finallly语句执行过程,示例如下。
# 定义除法函数
def divi(x,y):
try:
if x>y:
z=x/y
return z
except (ZeroDivisionError,TypeError):
print("调用者,你太大意了,有异常请检查")
finally:
print("不管是否发生异常,我都会执行",x,y)
res=divi(6,2)
print(res)
res=divi(6,0)
print(res)
res=divi(6,"2")
print(res)
res=divi(6,"abcd")
print(res)
运行结果
C:UsershccmaAnaconda3python.exe E:/wkp01/p00/test01/atestpkg/t29.py
不管是否发生异常,我都会执行 6 2
3.0
调用者,你太大意了,有异常请检查
不管是否发生异常,我都会执行 6 0
None
调用者,你太大意了,有异常请检查
不管是否发生异常,我都会执行 6 2
None
调用者,你太大意了,有异常请检查
不管是否发生异常,我都会执行 6 abcd
None
Process finished with exit code 0
Python内置异常
更多内容请参考官方手册(https://docs.python.org/zh-cn/3/library/exceptions.html#bltin-exceptions)。
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自定义异常
在实际开发中,有时候系统提供的异常类型不能满足开发的需求。这时候我们可以定义自己的异常。定义方法就是继承Exception类,定义自己的异常类。关于Python面向对象编程知识属于高级部分内容,不在本教程之列。如果需要,大家可以参考网上其他教程。