前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python学习笔记 异常处理

Python学习笔记 异常处理

作者头像
乐百川
发布2018-01-09 10:04:19
1.3K0
发布2018-01-09 10:04:19
举报

Python和很多其他语言一样,支持异常处理。我们可以使用try-catch类似的形式捕获异常,处理异常,或者抛出异常。Python的异常命名惯例和Java语言有些不同, Java的异常一般以Exception结尾,而Python的异常一般以Error结尾。

常见异常

首先我们来看看常见异常,这些异常可能由于编码错误或者其他原因导致。我们打开Python解释器,然后瞎打一通代码,应该就能看到不少异常了。

SyntaxError

系统错误最常见的原因就是编码的缩进错误、或者缺少了分号、冒号等分隔符。例如下面的例子。

代码语言:javascript
复制
if 0>1 
print()
  File "<input>", line 1
    if 0>1
          ^
SyntaxError: invalid syntax

NameError

这个异常通常是由于使用了未定义的名称而引起的。

代码语言:javascript
复制
fuck
Traceback (most recent call last):
  File "<input>", line 1, in <module>
NameError: name 'fuck' is not defined

ZeroDivisionError

这个异常是整数除零错误,一般在数学计算的时候才会出现。

代码语言:javascript
复制
1/0
Traceback (most recent call last):
  File "<input>", line 1, in <module>
ZeroDivisionError: division by zero

ValueError

ValueError异常一般在类型转换失败的时候出现。

代码语言:javascript
复制
int('3fuck')
Traceback (most recent call last):
  File "<input>", line 1, in <module>
ValueError: invalid literal for int() with base 10: '3fuck'

处理异常

捕获异常

Java等语言的使用try-catch结构捕获异常,在Python中也是类似的,不过捕获异常使用except关键字。在下面的例子中如果把第一行的fuck注释掉,就可以看到抛出了NameError异常并由except子句捕获了。

代码语言:javascript
复制
fuck = 'fuck!!!'
try:
    fuck
except NameError:
    print('This is a NameError')

多个相似的异常可以使用同一个子句捕获,这需要在except子句中用括号包含多个异常类型。

代码语言:javascript
复制
try:
    fuck
except (NameError, ValueError):
    print('This is a NameError')

如果需要对不同的异常使用不同的异常子句捕获,则可以列出多个异常子句。当抛出的异常是当前异常子句中异常的实例或者子类的实例时,都会匹配到当前子句。需要注意由于所有异常的父类是Excpetion,所以Excpetion类型的异常必须放到最后一个,避免其他异常子句无法执行。

代码语言:javascript
复制
try:
    fuck
except (NameError, ValueError):
    print('This is a NameError')
except SyntaxError:
    print('This is a SystemError')
except Exception:
    print('This is a RuntimeError')

最后一个异常子句的异常类型也可以省略,这样就会捕获所有其他未被捕获的异常。

代码语言:javascript
复制
try:
    fuck
except (NameError, ValueError):
    print('This is a NameError')
except SyntaxError:
    print('This is a SystemError')
except:
    print('This is a RuntimeError')

如果需要获取异常信息,可以使用as关键字声明异常变量,然后就可以在异常子句中使用了。

代码语言:javascript
复制
try:
    fuck
except (NameError, ValueError) as ex:
    print(f'This is a NameError:{ex}')

清理资源

如果异常处理语句中包含了系统资源(文件、网络连接、数据库连接等),我们有义务在使用完毕后及时释放这些资源。Python也提供了相应的机制。

释放资源主要通过两个子句来实现。第一个是else子句,该子句仅当没有抛出异常的时候才执行。如果有异常,这个字句就不会被执行。第二个子句是finally子句,不管有没有异常该语句都会执行。利用这两个语句,我们就可以优雅的关闭资源了。

代码语言:javascript
复制
try:
    raise MyError()
except (NameError, ValueError) as ex:
    print(f'This is a NameError:{ex}')
except MyError:
    print('This is MyError')
else:
    print('Else clause')
finally:
    print('This is finally clause')

抛出异常

我们可以在合适的时候抛出异常,让上级调用者决定如何处理异常。

下面的例子抛出了一个自定义异常。自定义异常是继承了Exception的类。定义之后使用raise语句抛出异常。

代码语言:javascript
复制
class MyError(Exception):
    pass

try:
    raise MyError()
except (NameError, ValueError) as ex:
    print(f'This is a NameError:{ex}')
except MyError:
    print('This is MyError')

如果在except子句中无法处理异常,需要再次向上级抛出,直接使用raise关键字即可。

代码语言:javascript
复制
try:
    raise MyError()
except (NameError, ValueError) as ex:
    print(f'This is a NameError:{ex}')
except MyError:
    print('This is MyError')
    raise 
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017年04月01日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 常见异常
    • SyntaxError
      • NameError
        • ZeroDivisionError
          • ValueError
          • 处理异常
            • 捕获异常
              • 清理资源
                • 抛出异常
                相关产品与服务
                数据库
                云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
                领券
                问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档