博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
06异常
阅读量:5901 次
发布时间:2019-06-19

本文共 4229 字,大约阅读时间需要 14 分钟。

Python使用被称为异常的特殊对象来管理程序执行期间发生的错误。每当发生让Python不知 所措的错误时,它都会创建一个异常对象。如果你编写了处理该异常的代码,程序将继续运行; 如果你未对异常进行处理,程序将停止,并显示一个traceback,其中包含有关异常的报告。

异常是使用 try-except 代码块处理的。 try-except 代码块让Python执行指定的操作,同时告 诉Python发生异常时怎么办。使用了 try-except 代码块时,即便出现异常,程序也将继续运行: 显示你编写的友好的错误消息,而不是令用户迷惑的traceback。

 

1.处理 ZeroDivisionError 异常

下面来看一种导致Python引发异常的简单错误。你可能知道不能将一个数字除以0,但我们 还是让Python这样做吧:

In [1]:
print(5/0)
 
---------------------------------------------------------------------------ZeroDivisionError                         Traceback (most recent call last)
in
----> 1print(5/0)ZeroDivisionError: division by zero
 

在上述traceback中,指出的错误 ZeroDivisionError 是一个异常对象。Python无法按你的 要求做时,就会创建这种对象。在这种情况下,Python将停止运行程序,并指出引发了哪种异常, 而我们可根据这些信息对程序进行修改。下面我们将告诉Python,发生这种错误时怎么办;这样, 如果再次发生这样的错误,我们就有备无患了。

 

2.使用 try-except 代码块

当你认为可能发生了错误时,可编写一个 try-except 代码块来处理可能引发的异常。你让 Python尝试运行一些代码,并告诉它如果这些代码引发了指定的异常,该怎么办。 处理 ZeroDivisionError 异常的 try-except 代码块类似于下面这样:

In [2]:
def caculator(a, b):    try:        print(a / b)    except ZeroDivisionError:        print("You can't divide by zero!")    print('继续执行')
In [4]:
caculator(5,0)
 
You can't divide by zero!继续执行
In [5]:
caculator(5,1)
 
5.0继续执行
 

我们将导致错误的代码行 print(5/0) 放在了一个 try 代码块中。如果 try 代码块中的代码运行 起来没有问题,Python将跳过 except 代码块;如果 try 代码块中的代码导致了错误,Python将查找 这样的 except 代码块,并运行其中的代码,即其中指定的错误与引发的错误相同。

在这个示例中, try 代码块中的代码引发了 ZeroDivisionError 异常,因此Python指出了该如 何解决问题的 except 代码块,并运行其中的代码。这样,用户看到的是一条友好的错误消息,而 不是 traceback。

 

如果 try-except 代码块后面还有其他代码,程序将接着运行,因为已经告诉了Python如何处 理这种错误,捕获错误后程序将继续运行。

 

3.else模块

通过将可能引发错误的代码放在 try-excep t代码块中,可提高这个程序抵御错误的能力。错 误是执行除法运算的代码行导致的,因此我们需要将它放到 try-except 代码块中。这个示例还包 含一个 else 代码块;依赖于 try 代码块成功执行的代码都应放到 else 代码块中

In [6]:
def caculator(a, b):    try:        print(a / b)    except ZeroDivisionError:        print("You can't divide by zero!")    else:        print('成功运行')
In [8]:
caculator(5,1)
 
5.0成功运行
 

4.捕获多个异常

In [9]:
try:    a = 1    print(a)    b = 1 / 0    print('hello')  # 异常抛出后不会继续执行了except (NameError, ZeroDivisionError):    print('出现异常了')
 
1出现异常了
In [10]:
try:    a = 1    print(a)    b = 1 / 0    print('hello')  # 异常抛出后不会继续执行了except (NameError, ZeroDivisionError) as ex:  # ex代表刚刚捕获的异常对象    print('出现异常了')    print(ex)
 
1出现异常了division by zero
In [11]:
try:    a = 1    print(a)    b = 1 / 0    print('hello')  # 异常抛出后不会继续执行了except (NameError, ZeroDivisionError) as ex:  # ex代表刚刚捕获的异常对象    print('出现异常了')    print(ex)print('hello world')  # 因为捕获异常,所以继续执行
 
1出现异常了division by zerohello world
In [21]:
x = "123"f = open('a.txt', 'w')try:    f.write("hello")    f.write("world %d" % x)    print('ok')except Exception as ex:  # Exception所有异常的父类    print('出现异常')    print(ex)finally:  # 不管前面是否出现异常都会执行    print('文件关闭')    f.close()
 
出现异常%d format: a number is required, not str文件关闭
In [22]:
x = "123"f = open('a.txt', 'w')try:    f.write("hello")    # f.write("world %d" % x)    print('ok')except Exception as ex:  # Exception所有异常的父类    print('出现异常')    print(ex)else:  # 没有异常的情况下会执行的代码    print('没有异常的情况下会执行的代码')finally:  # 不管前面是否出现异常都会执行    print('文件关闭')    f.close()
 
ok没有异常的情况下会执行的代码文件关闭
 

5.异常的嵌套

In [30]:
try:    f = open('data\\programming.txt')    try:        content = f.read()        content.index("hadoop")    except ValueError as ex:        print(ex)except FileNotFoundError as ex:    print(ex)finally:    print('文件关闭')    f.close()
 
substring not found文件关闭
 

一次性捕获所有异常就可以了,异常嵌套不常用

In [31]:
try:    f = open('data\\programming.txt')    content = f.read()    content.index("hadoop")except Exception as ex:    print(ex)
 
substring not found
 

6.自定义异常

In [32]:
class PasswordException(Exception):    def __init__(self, password, min_length):        self.password = password        self.min_length = min_length            def __str__(self):        return "%s的密码错误,密码最小长度为%s" % (self.password, self.min_length)
In [33]:
def reg(username, password):    if len(password) < 6:        raise PasswordException(password, 6)    else:        print("用户名为 %s,密码为 %s" % (username, password))
In [35]:
try:    reg('zs', '1234')except Exception as ex:    print(ex)
 
1234的密码错误,密码最小长度为6
In [36]:
try:    reg('zs', '1234')except PasswordException as ex:    print(ex)
 
1234的密码错误,密码最小长度为6
 

转载于:https://www.cnblogs.com/xinmomoyan/p/10862588.html

你可能感兴趣的文章
Java类加载器( 死磕8)
查看>>
小蚂蚁学习APP接口开发(1)—— json方式封装通信接口
查看>>
我的友情链接
查看>>
CDN相关
查看>>
Tomcat的设置4——Tomcat的体系结构与设置基于端口号的虚拟主机
查看>>
三种判断端口存活的方法和链接200的判断方法
查看>>
我的友情链接
查看>>
ftp协议基础
查看>>
顺时针打印矩阵
查看>>
JAXB
查看>>
端口聚合配置
查看>>
访问共享经常中断
查看>>
当你有一个锤子,你看什么都像钉子
查看>>
一个很实用的samba案例
查看>>
100个MySQL的调节和优化的提示
查看>>
HostMonster主机修改文件权限的方法
查看>>
人生的交易
查看>>
TP5中关联模型的使用详解
查看>>
springMVC注解之入门
查看>>
不用花钱!Android模拟器让你在电脑上免费体验谷歌手机
查看>>