Python Exception and Debug


Python Exception and Debug

什么是异常

处理一些不可预料的情况,比如文件不存在,空间满了,通讯超时等等。

遇到这些问题了程序该如何执行?

这就是异常处理的价值和我们处理异常的目的。

Python常见的异常

  • ZeroDivisionError
  • NameError
  • TypeError

Eg:

ZeroDivisionError

image-20220618180916517

  • 这么写,没有任何的语法错误,IDE不会报错

image-20220618181014653

  • 但是一运行起来就发现了错误

NameError

image-20220618181230216

  • 之前没有定义过b,但是这里用到了

TypeError

image-20220618181313133

  • 两个不同类型的数强制进行运算

Python 的异常处理语法

try:
	程序执行语句块
except ExceptionName as alias:
    异常处理语句块
except ExceptionName as alias:
    异常处理语句块
except ExceptionName as alias:
    异常处理语句块
...
else:
    无异常时处理语句块
finally:
    必须处理语句块
  • Exception 类型有很多,可以层层分析,对应着处理。最后可以加上处理 Exception 的语句,因为 Exception是父类,能捕获所有的异常。
  • Exception

例子

example 1 - 简单例子

try:
    print(10/0)
except NameError as e:
    print(type(e))
    print(e)
except ZeroDivisionError as e:
    print(type(e))
    print(e)

print('-------------End of the process-------------')

结果

<class 'ZeroDivisionError'>
division by zero
-------------End of the process-------------

Process finished with exit code 0
  • 10/0 , ZeroDivisionError 的异常被成功 catch

example 2 - 合并两个 except

  • 从上面的例子可以看到,我们的程序对于两个不同异常的处理手段是一样的,那么可以合并
try:
    print(10/0)
except (NameError, ZeroDivisionError) as e:
    print(type(e))
    print(e)

print('-------------End of the process-------------')
<class 'ZeroDivisionError'>
division by zero
-------------End of the process-------------

Process finished with exit code 0
  • 依然成功执行了

example 3 - Exception

try:
    print('2'+2)
except (NameError, ZeroDivisionError) as e:
    print(type(e))
    print(e)
except Exception as e:
    print(type(e))
    print(e)
print('-------------End of the process-------------')
<class 'TypeError'>
can only concatenate str (not "int") to str
-------------End of the process-------------

Process finished with exit code 0
  • 我们可以在最后抓住Exception,这样不管任何类型的异常,无论考虑到的还是没考虑到的,都能抓住。

  • 我们没有针对TypeError 进行捕获,但依然catch了。

example 4 - else

try:
    a = 1+1
except (NameError, ZeroDivisionError) as e:
    print(type(e))
    print(e)
except Exception as e:
    print(type(e))
    print(e)
else:
    print('else')
print('-------------End of the process-------------')
else
-------------End of the process-------------

Process finished with exit code 0
  • 语句中没有任何错误,所以程序执行else语句
  • 当任一一个错误被捕获,else语句都不会被执行

example 5 - finally

try:
    print(10/0)
except (NameError, ZeroDivisionError) as e:
    print(type(e))
    print(e)
except Exception as e:
    print(type(e))
    print(e)
else:
    print('else')
finally:
    print('finally')
print('-------------End of the process-------------')
<class 'ZeroDivisionError'>
division by zero
finally
-------------End of the process-------------

Process finished with exit code 0
  • finally 语句一定会执行
  • 就算程序没错误,执行了else,也会执行finally

Python 内置异常类型

image-20220618214423110

主动抛出异常 - raise


Author: Liang Junyi
Reprint policy: All articles in this blog are used except for special statements CC BY 4.0 reprint policy. If reproduced, please indicate source Liang Junyi !
  TOC