Python基础---异常

Python用异常对象(Exception Object)来表示异常情况。在遇到错误后,异常对象会引发异常。如果异常对象并未被处理或捕捉到,则程序会用回溯(Traceback, 一种错误信息)来终止程序。

认识异常

下面来看程序在执行时所抛出的异常。

>>> open("abc.txt", 'r')
Traceback (most recent call last) :
    File "<stdin>", line 1, in <module>
FileNotFoundrror: [Errno 2] No such file or directory: 'abc. txt1’

首先,我们通过open()方法以读“r”"的方式打开一个abe.txt文件。然后,Python抛出一个 FileNotFoundError类型的异常,它告诉我们:No such file or dreetory:“ab.xt” (没有 abe.txt这样的文件或目录),因为我们根本就没有创建这个文件。
既然知道当打开一个不存在的文件时会抛出FloFondErorr异常,那么我们就可以通过Python提供的try except语句来捕捉并处理这个异常。创建a.py文件,代码如下:

try:
    open("abc.txt", 'r')
except FileNotFoundError:
    print("异常了!")

再来运行程序,因为已经用try except捕捉到FileNotFoundEror异常,所以“异常了!”会被打印出来。修改程序,使其打印一个没有定义的变量a。

try:
    print(a)
except FileNotFoundError:
    print("异常了!")

这次依然会抛出异常信息。

Traceback (most recent call last):
File "D:\pY_ base\abnormal.py", line 3in <module>print (a)
NameError: name 'a' is not defined

这一次抛出的是NameError类型的错误,而FileNotFoundError只能接收找不到文件的错误。这里我们只需将捕捉异常类型修改为NameError即可

异常的抛出机制?

1.如果在运行时发生异常,那么解释器会查找相应的处理语句(称为handler)。
2.如果在当前函数里没有找到相应的处理语句,那么解释器会将异常传递给上层的调用函数,看看那里能不能处理。
3.如果在最外层函数 (全局函数 main()也没有找到,那么解释器会退出, 同时打印Traceback, 以便让用户找到错误产生的原因。

注意:虽然大多数错误会导致异常,但异常不一定代表错误,有时候它们只是一个警告,有时候是一个终止信号,如退出循环等。

在Python中,所有的异常类都继承自Exceptiono但自Python2.5版本之后,所有的异常类都有了新的基类BaseException。Exception同样也继承自BascEException, 所以我们可以使用BaseException来接收所有类型的异常。

try:
    open("abc.txt",'r')
    print (a)
except BaseException:
    print("异常了!")

对于上面的例子,只要其中一行出现异常,BaseException就能捕捉到并打印“异常了!”。但是我们并不知道具体哪一行代码引起了异常,如何让Python直接告诉我们异常的原因呢?

try:
open("abc. txt", 'r')
print (a)
except BaseException as msg:
print (msg)

我们在BaseException后面定义了msg变量来接收异常信息,并通过print()将其打印出来。
Python常见异常
在这里插入图片描述

更多异常用法

try except else用法。

try:
    a="异常测试:
    print (a)
except NameError as msg:
    print (msg)
else:
    print("没有异常时执行!")

这里我们对变量a进行了赋值,如果没有异常,则会执行else语句后面的内容。

有时候,我们希望不管是否出现异常,有些操作都会被执行,例如,文件的关闭、锁的释放、把数据库连接返还给连接池等。我们可以使用try…except… finally实现这样的需求。

try:
    print(a)
except NameError as msg:
    print (msg)
finally:
    print("不管是否出现异常,都会被执行。")

我们给变量a赋值后,再次运行上面的代码,验证fnally语句体是否被执行。

抛出异常

如果你开发的是一个第三方库或框架,那么在程序运行出错时抛出异常会更为专业。在Python中,raise 关键字可用来抛出一个异常信息。

#定义say_ hello()函数
def say_ he1lo (name=None) :
if name is None:
    raise NmaeError('"name" cannot be empty')
else:
    print("hello,%s" %name)
#调用say_ hello()函数
say_hello()

首先定义say_ hello()函数,设置参数name为None。在函数中判断参数name如果为None,则抛出NameEror异常,提示““name” cannot be empty" ;否则,打印hello
当我们调用say_ hello()函数不传参数时。结果如下。

Traceback(most recentcalllast) :
File "D:\pYbaselabnormal.py"'line 11, in<module>
say. hello()
abnormal.Py 1line 5in say_ hello
File "D:\pY_
innamen cannot be emptY )
raise NameError ("name"
NameError: "name"cannot be empty

需要注意的是,raise 只能使用Python提供的异常类,如果想要raise使用自定义异常类,则自定义异常类需要继承Eception类。

新手常犯的错误

(1) Python没有使用{}来表示语句体,当碰到冒号(😃 结尾的语句时,一定要用四个空格或Tab键进行缩进。但在一 个语句体中不要混合使用四个空格和Tab键。
(2)大部分方法两边带的下画线多半是双下画线,如“init ”, 不要写成“init
(3)项目不要都创建在Python 的安装目录中,初学者可能会误以为只有把程序建在Python的安装目录下才能运行,其实不然。例如,在C盘安装了音乐播放器,那么只要把音乐文件设置为由该播放器打开,那么在硬盘中任何一个角落的音乐文件都能由该播放照打开。Python 程序也是如此,只要正确地把Python目录配置到环境变量Path下,任何目录下的Python程序都可以被执行。
(4)在Pyhon程序文件路径中,应尽量避免出现中文或空格。这可能会导致有些编辑器无法运行该程序,例如, Soblime Text就无法运行这种目录下的程序。
(5)创建的目录与文件名不要与引用类库同名。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值