Python基础教程

003_用try_except处理异常

用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面向对象编程知识属于高级部分内容,不在本教程之列。如果需要,大家可以参考网上其他教程。

这篇文章对您有用吗?

我们要如何帮助您?