【python】错误和异常(第二讲)

简介: 处理多个异常,并不是因为同时报出多个异常。程序在运行中,只要遇到一个异常就会有反应,所以,每次捕获到的异常一定是一个。所谓处理多个异常的意思是可以容许捕获不同的异常,有不同的 except 子句处理。......

 🍁作者简介:🏅云计算领域优质创作者🏅新星计划第三季python赛道TOP1🏅 阿里云ACE认证高级工程师🏅

✒️个人主页:小鹏linux

💊个人社区:小鹏linux(个人社区)欢迎您的加入!

image.gif编辑

try...except...是处理异常的基本方式。在原来的基础上,还可有扩展.

目录

1.处理多个异常

2. else 子句

3. finally

4. 和条件语句相比

👑👑👑结束语👑👑👑


1.处理多个异常

处理多个异常,并不是因为同时报出多个异常。程序在运行中,只要遇到一个异常就会有反应,所以,每次捕获到的异常一定是一个。所谓处理多个异常的意思是可以容许捕获不同的异常,有不同的 except 子句处理。

#!/usr/bin/env Python
# coding=utf-8
while 1:
    print "this is a division program."
    c = raw_input("input 'c' continue, otherwise logout:")
    if c == 'c':
        a = raw_input("first number:")
        b = raw_input("second number:")
        try:
            print float(a)/float(b)
            print "*************************"
        except ZeroDivisionError:
            print "The second number can't be zero!"
            print "*************************"
        except ValueError:
            print "please input number."
            print "************************"
    else:
        break

image.gif

将上节的一个程序进行修改,增加了一个 except 子句,目的是如果用户输入的不是数字时,捕获并处理这个异常。测试如下:

$ python 21701.py
this is a division program.
input 'c' continue, otherwise logout:c
first number:3
second number:"hello" #输入了一个不是数字的东西
please input number. #对照上面的程序,捕获并处理了这个异常
************************
this is a division program.
input 'c' continue, otherwise logout:c
first number:4
second number:0
The second number can't be zero!
*************************
this is a division program.
input 'c' continue, otherwise logout:4
$

image.gif

如果有多个 except,在 try 里面如果有一个异常,就转到相应的 except 子句,其它的忽略。如果 except 没有

相应的异常,该异常也会抛出,不过这是程序就要中止了,因为异常“浮出”程序顶部。

除了用多个 except 之外,还可以在一个 except 后面放多个异常参数,比如上面的程序,可以将 except 部分修改为:

except (ZeroDivisionError, ValueError):
    print "please input rightly."
    print "********************"

image.gif

运行的结果就是:

$ python 21701.py
this is a division program.
input 'c' continue, otherwise logout:c
first number:2
second number:0 #捕获异常
please input rightly.
********************
this is a division program.
input 'c' continue, otherwise logout:c
first number:3
second number:a #异常
please input rightly.
********************
this is a division program.
input 'c' continue, otherwise logout:d
$

image.gif

需要注意的是,except 后面如果是多个参数,一定要用圆括号包裹起来。否则,后果自负。

突然有一种想法,在对异常的处理中,前面都是自己写一个提示语,发现自己写的不如内置的异常错误提示更

好。希望把它打印出来。但是程序还能不能中断。Python 提供了一种方式,将上面代码修改如下:

while 1:
    print "this is a division program."
    c = raw_input("input 'c' continue, otherwise logout:")
    if c == 'c':
        a = raw_input("first number:")
        b = raw_input("second number:")
        try:
            print float(a)/float(b)
            print "*************************"
        except (ZeroDivisionError, ValueError), e:
            print e
            print "********************"
    else:
        break

image.gif

运行一下,看看提示信息。

$ python 21702.py
this is a division program.
input 'c' continue, otherwise logout:c
first number:2
second number:a #异常
could not convert string to float: a
********************
this is a division program.
input 'c' continue, otherwise logout:c
first number:2
second number:0 #异常
float division by zero
********************
this is a division program.
input 'c' continue, otherwise logout:d
$

image.gif

以上程序中,之处理了两个异常,还可能有更多的异常呢?如果要处理,怎么办?可以这样: execpt: 或者 except Exception, e ,后面什么参数也不写就好了。

2. else 子句

有了 try...except... ,在一般情况下是够用的,但总有不一般的时候出现,所以,就增加了一个 else 子句。其

实,人类的自然语言何尝不是如此呢?总要根据需要添加不少东西。

>>> try:
...     print "I am try"
... except:
...     print "I am except"
... else:
...     print "I am else"
...
I am try
I am else

image.gif

这段演示,能够帮助读者理解 else 的执行特点。如果执行了 try,则 except 被忽略,但是 else 被执行。

>>> try:
...     print 1/0
... except:
...     print "I am except"
... else:
...     print "I am else"
...
I am except

image.gif

这时候 else 就不被执行了。

理解了 else 的执行特点,可以写这样一段程序,还是类似于前面的计算,只不过这次要求,如果输入的有误,就不断要求从新输入,知道输入正确,并得到了结果,才不再要求输入内容,程序结束。

在看下面的参考代码之前,读者是否可以先自己写一段呢?并调试一下,看看结果如何。

#!/usr/bin/env Python
# coding=utf-8
while 1:
    try:
        x = raw_input("the first number:")
        y = raw_input("the second number:")
        r = float(x)/float(y)
        print r
    except Exception, e:
        print e
        print "try again."
    else:
        break

image.gif

先看运行结果:

$ python 21703.py
the first number:2
the second number:0 #异常,执行 except
float division by zero
try again. #循环
the first number:2
the second number:a #异常
could not convert string to float: a
try again.
the first number:4
the second number:2 #正常,执行 try
2.0 #然后 else:break,退出程序
$

image.gif

相当满意的执行结果。

需要对程序中的 except 简单说明,这次没有像前面那样写,而是 except Exception, e ,意思是不管什么异 常,这里都会捕获,并且传给变量 e,然后用 print e 把异常信息打印出来。

3. finally

finally 子句,一听这个名字,就感觉它是做善后工作的。的确如此,如果有了 finally,不管前面执行的是 try,还是 except,它都要执行。因此一种说法是用 finally 用来在可能的异常后进行清理。比如:

>>> x = 10
>>> try:
...     x = 1/0
... except Exception, e:
...     print e
... finally:
...     print "del x"
...     del x
...
integer division or modulo by zero
del x

image.gif

看一看 x 是否被删除?

>>> x
Traceback (most recent call last):
    File "<stdin>", line 1, in <module>
NameError: name 'x' is not defined

image.gif

当然,在应用中,可以将上面的各个子句都综合起来使用,写成如下样式:

try:
    do something
except:
    do something
else:
    do something
finally
    do something

image.gif

4. 和条件语句相比

try...except... 在某些情况下能够替代 if...else.. 的条件语句。这里我无意去比较两者的性能,因为看到有人讨

论这个问题。我个人觉得这不是主要的,因为它们之间性能的差异不大。主要是你的选择。一切要根据实际情况而定,不是说用一个就能包打天。

👑👑👑结束语👑👑👑

image.gif编辑

目录
相关文章
|
9月前
|
运维 监控 算法
时间序列异常检测:MSET-SPRT组合方法的原理和Python代码实现
MSET-SPRT是一种结合多元状态估计技术(MSET)与序贯概率比检验(SPRT)的混合框架,专为高维度、强关联数据流的异常检测设计。MSET通过历史数据建模估计系统预期状态,SPRT基于统计推断判定偏差显著性,二者协同实现精准高效的异常识别。本文以Python为例,展示其在模拟数据中的应用,证明其在工业监控、设备健康管理及网络安全等领域的可靠性与有效性。
1039 13
时间序列异常检测:MSET-SPRT组合方法的原理和Python代码实现
|
7月前
|
人工智能 C# Python
处理python异常
本文介绍了Python中的异常处理机制,并实现了一个简单的异常装饰器。通过`try/except`语句捕获异常,结合`finally`子句完成清理工作。为进一步优化代码结构,文章提出了使用装饰器处理异常的方法,避免函数中大量冗长的异常处理语句。通过类封装异常装饰器,多个函数可共享异常处理逻辑,提升代码简洁性和可维护性。总结强调了装饰器在异常处理中的优势,使代码更加优雅高效。
178 27
|
8月前
|
Python
如何处理python的常见异常问题
在Python语言中,python异常处理机制主要依赖try、except、else、finally和raise五个关键字。本篇文章将为大家详细讲解一下如何处理python的常见异常问题。
|
10月前
|
人工智能 Shell 开发工具
[oeasy]python065python报错怎么办_try_试着来_except_发现异常
本文介绍了Python中处理异常的基本方法,重点讲解了`try`和`except`的用法。通过一个计算苹果重量的小程序示例,展示了如何捕获用户输入错误并进行处理。主要内容包括: 1. **回顾上次内容**:简要回顾了Shell环境、Python3游乐场和Vim编辑器的使用。 2. **编写程序**:编写了一个简单的程序来计算苹果的总重量,但发现由于输入类型问题导致结果错误。 3. **调试与修正**:通过调试发现输入函数返回的是字符串类型,需要将其转换为整数类型才能正确计算。
367 32
|
10月前
|
数据库 Python
[oeasy]python066_如何捕获多个异常_try_否则_else_exception
本文介绍了Python中`try...except...else`结构的使用方法。主要内容包括: 1. **回顾上次内容**:简要复习了`try`和`except`的基本用法,强调了异常处理的重要性。 2. **详细解释**: - `try`块用于尝试执行代码,一旦发现错误会立即终止并跳转到`except`块。 - `except`块用于捕获特定类型的异常,并进行相应的处理。 - `else`块在没有异常时执行,是可选的。 3. **示例代码**:通过具体例子展示了如何捕获不同类型的异常(如`ValueError`和`ZeroDivisionError`),并解释了异常处理
202 24
|
存储 索引 Python
Python生成器、装饰器、异常(2)
【10月更文挑战第16天】
184 1
Python生成器、装饰器、异常(2)
|
测试技术 开发者 Python
对于Python中的异常要如何处理,raise关键字你真的了解吗?一篇文章带你从头了解
`raise`关键字在Python中用于显式引发异常,允许开发者在检测到错误条件时中断程序流程,并通过异常处理机制(如try-except块)接管控制。`raise`后可跟异常类型、异常对象及错误信息,适用于验证输入、处理错误、自定义异常、重新引发异常及测试等场景。例如,`raise ValueError(&quot;Invalid input&quot;)`用于验证输入数据,若不符合预期则引发异常,确保数据准确并提供清晰错误信息。此外,通过自定义异常类,可以针对特定错误情况提供更具体的信息,增强代码的健壮性和可维护性。
|
Python
在Python中,`try...except`语句用于捕获和处理程序运行时的异常
在Python中,`try...except`语句用于捕获和处理程序运行时的异常
355 5
|
Python
在Python中,自定义函数可以抛出自定义异常
在Python中,自定义函数可以抛出自定义异常
257 5
|
存储 开发者 Python
自定义Python的异常
自定义Python的异常
210 5

推荐镜像

更多