python异常与错误

x33g5p2x  于2021-08-23 转载在 Java  
字(2.9k)|赞(0)|评价(0)|浏览(122)

一 前言

本篇文章将介绍什么是异常,初学者遇见异常时发生的情况,如何捕获和处理异常,以及自定义异常;

二 异常与错误介绍

通常的错误是指语法错误,即在编码后进行编译的时候就会发生的错误,一般高级的编译器都能自动识别语法错误;比较重要的就是异常,异常是指在程序执行期间发生的错误,比如报空异常,算术异常等待;通常我们可以使用raise抛出一个异常或者使用assert断言一个异常;

三 异常的处理方式

3.1 异常示例

# -*- coding: utf-8 -*-

result = 5/0

当执行以上程序的时候就会出现异常(常数不能除0);出现错误信息如下,此时会造成程序停止,这是在开发中一种非常不友好的现象;我们需要的是打印出异常信息(通常是日志的方式),然后程序继续运行,并且不影响其它模块的程序运行;

Traceback (most recent call last):
  File "C:/python_work/study_py_base/base/expre.py", line 3, in <module>
    result = 5/0
ZeroDivisionError: division by zero

3.2 try/except

通常最简单的异常就是try/except模式进行处理,具体的说明如下

  1. try 代码块中存放的内容是有可能会发生异常的代码
  2. except 代码块存放的内容是对发生异常时进行处理的动作,通常就是不做任务处理或者打印异常信息;
# -*- coding: utf-8 -*-

try:
	result = 5/0

except ZeroDivisionError:
	print("the error occur ")

print("zszxz")

以上代码执行后不会像3.1节中的程序立即停止,而是会继续运行后面的代码,打印内容如下,由此我们就解决了捕获异常,打印自定义异常信息;

the error occur 
zszxz

现在异常打印的内容是自定义,如果知识追寻者想要打印原来的异常信息就需要对ZeroDivisionError 对象进行进一步的属性或者方法调用

# -*- coding: utf-8 -*-

try:
	result = 5/0

except ZeroDivisionError as e:
    print(e)

print("zszxz")

以上的代码执行后就会打印出原有的异常信息

division by zero
zszxz

3.3 try/except...else

  1. try 代码块中存放的内容是有可能会发生异常的代码
  2. except 代码块存放的内容是对发生异常时进行处理的动作
  3. else是存放不会发生异常的代码,有个坑是如果try中的代码发生异常了,else中的代码是不会执行的;

try代码块中没有发生异常的情况

# -*- coding: utf-8 -*-

try:
	result = 5/6
except ZeroDivisionError as e:
	print("the error is {}".format(e))
else:
	print(" normal code ")

执行结果

 normal code 

try代码块中发生异常的情况

# -*- coding: utf-8 -*-

try:
	result = 5/0
except ZeroDivisionError as e:
	print("the error is {}".format(e))
else:
	print(" normal code ")

执行结果

the error is division by zero

3.4 try-finally

  1. try 代码块中存放的内容是有可能会发生异常的代码
  2. except 代码块存放的内容是对发生异常时进行处理的动作
  3. else是存放不会发生异常的代码,有个坑是如果try中的代码发生异常了,else中的代码是不会执行的
  4. finally中存放的代码无论是否发生异常都会执行,通常我们用来关闭资源句柄;
# -*- coding: utf-8 -*-

try:
	result = 5/0
except ZeroDivisionError as e:
	print("the error is {}".format(e))
else:
	print(" normal code ")
finally:
	print(" it must be excuted")

输出结果

the error is division by zero
 it must be excuted

四 抛出异常

有时候在编码过程中,出现了一些不是我们想要的结果的时候就可以抛出异常;比如我们想要获得一个参数是int类型,结果接受到的是字符串类型,这时候你就可以抛出一个异常告诉那个传字符串类型参数的家伙,这不是我要的类型的数据;

怎么抛出异常呢,很简单使用raise关键字,后面跟上异常对象即可,示例如下

# -*- coding: utf-8 -*-

param = "收下我的心意吧"

if type(param)==int:
    print("这是我要的类型")
else:
    raise NameError('这不是我要的类型')

此时就出现异常信息如下

Traceback (most recent call last):
  File "C:/python_work/study_py_base/base/expre.py", line 8, in <module>
    raise NameError('这不是我要的类型')
NameError: 这不是我要的类型

五 自定义异常

在第四节抛出异常的时候是不是感觉有点怪怪的呢,NameError 这个异常是系统自带的异常,我们是直接拿过来用了,可是跟异常信息一点都不符合对吧,应该是TypeError才对,这样异常对象就能和异常信息匹对上了;因此为了让异常显示的更加规范和友好就需要用户自定义异常,而不是使用系统那些默认的异常(如果异常信息匹配就使用系统自带的即可)

如下示例中自定义异常类需要继承Exception,然后覆盖重写__init__ 方法即可,此时抛出的异常就比较规范了;

# -*- coding: utf-8 -*-

param = "收下我的心意吧"

if type(param)==int:
    print("这是我要的类型")
else:
    raise TypeError('这不是我要的类型')


"""自定义异常"""
class TypeError(Exception):
        def __init__(self, value):
            self.value = value

执行结果

Traceback (most recent call last):
  File "C:/python_work/study_py_base/base/expre.py", line 8, in <module>
    raise TypeError('这不是我要的类型')
TypeError: 这不是我要的类型

相关文章