Python3 错误和异常

84 篇文章 0 订阅

Python3 错误和异常

作为 Python 初学者,在刚学习 Python 编程时,经常会看到一些报错信息,在前面我们没有提及,这章节我们会专门介绍。

Python 有两种错误很容易辨认:语法错误和异常。

Python assert(断言)用于判断一个表达式,在表达式条件为 false 的时候触发异常。

在这里插入图片描述

标准异常如下列表

异常名称描述
Exception所有异常的基类
StopIteration当一个迭代器的 next()方法不指向任何对象时引发
SystemExit由 sys.exit()函数引发
StandardError除了StopIteration异常和SystemExit,所有内置异常的基类
ArithmeticError数值计算所发生的所有错误的基类
OverflowError当数字类型计算超过最高限额引发
FloatingPointError当一个浮点运算失败时触发
ZeroDivisonError当除运算或模零在所有数值类型运算时引发
AssertionError断言语句失败的情况下引发
AttributeError属性引用或赋值失败的情况下引发
EOFError当从 raw_input() 与 input() 函数输入,到达文件末尾时触发
ImportError当一个 import 语句失败时触发
KeyboardInterrupt当用户中断程序执行,通常是通过按 Ctrl+c 引发
LookupError所有查找错误基类
IndexErrorKeyError当在一个序列中没有找到一个索引时引发当指定的键没有在字典中找到引发
NameError当在局部或全局命名空间中找不到的标识引发
UnboundLocalErrorEnvironmentError试图访问在函数或方法的局部变量时引发,但没有值分配给它。Python环境之外发生的所有异常的基类。
IOErrorIOError当一个输入/输出操作失败,如打印语句或 open()函数试图打开不存在的文件时引发操作系统相关的错误时引发
SyntaxErrorIndentationError当在Python语法错误引发;没有正确指定缩进引发。
SystemError当解释器发现一个内部问题,但遇到此错误时,Python解释器不退出引发
SystemExit当Python解释器不使用sys.exit()函数引发。如果代码没有被处理,解释器会退出。当操作或函数在指定数据类型无效时引发
ValueError在内置函数对于数据类型,参数的有效类型时引发,但是参数指定了无效值
RuntimeError当生成的错误不属于任何类别时引发
NotImplementedError当要在继承的类来实现,抽象方法实际上没有实现时引发此异常

在Python中断言

断言是一种理智检查,当程序的测试完成,你可以打开或关闭。
断言的最简单的方法就是把它比作 raise-if 语句 (或者更准确,加 raise-if-not 声明). 一个表达式进行测试,如果结果出现 false,将引发异常。
断言是由 assert 语句,在Python中新的关键字,在Python1.5版本中引入使用的关键字。
程序员常常放置断言来检查输入的有效,或在一个函数调用后检查有效的输出。

assert 语句当它遇到一个断言语句,Python评估计算之后的表达式,希望是 true 值。如果表达式为 false,Python 触发 AssertionError 异常。

断言的语法是 -

assert Expression[, Arguments] 

如果断言失败,Python使用 ArgumentExpression 作为AssertionError异常的参数。AssertionError异常可以被捕获,并用 try-except语句处理类似其他异常,但是,如果没有处理它们将终止该程序并产生一个回溯。

示例这里是一个把从开氏度到华氏度的温度转换函数。

#!/usr/bin/python3
def KelvinToFahrenheit(Temperature):
    assert (Temperature >= 0),"Colder than absolute zero!"
    return ((Temperature-273)*1.8)+32

print (KelvinToFahrenheit(273))
print (int(KelvinToFahrenheit(505.78)))
print (KelvinToFahrenheit(-5))

当执行上面的代码,它产生以下结果 -

32.0
451
Traceback (most recent call last):
File "test.py", line 9, in 
print KelvinToFahrenheit(-5)
File "test.py", line 4, in KelvinToFahrenheit
assert (Temperature >= 0),"Colder than absolute zero!"
AssertionError: Colder than absolute zero!

except子句中无异常

也可以使用 except 语句定义如下无异常声明如下 -

try:
   You do your operations here
   ......................
except:
   If there is any exception, then execute this block.
   ......................
else:
   If there is no exception then execute this block. 

except子句与多个异常

也可以使用相同的 except 语句来处理多个异常,具体如下 -

try:
   You do your operations here
   ......................
except(Exception1[, Exception2[,...ExceptionN]]]):
   If there is any exception from the given exception list, 
   then execute this block.
   ......................
else:
   If there is no exception then execute this block. 

try/except…else

try/except 语句还有一个可选的 else 子句,如果使用这个子句,那么必须放在所有的 except 子句之后。

else 子句将在 try 子句没有发生任何异常的时候执行。

在这里插入图片描述
以下实例在 try 语句中判断文件是否可以打开,如果打开文件时正常的没有发生异常则执行 else 部分的语句,读取文件内容:

for arg in sys.argv[1:]:
    try:
        f = open(arg, 'r')
    except IOError:
        print('cannot open', arg)
    else:
        print(arg, 'has', len(f.readlines()), 'lines')
        f.close()

使用 else 子句比把所有的语句都放在 try 子句里面要好,这样可以避免一些意想不到,而 except 又无法捕获的异常。

异常处理并不仅仅处理那些直接发生在 try 子句中的异常,而且还能处理子句中调用的函数(甚至间接调用的函数)里抛出的异常。例如:

>>> def this_fails():
        x = 1/0
   
>>> try:
        this_fails()
    except ZeroDivisionError as err:
        print('Handling run-time error:', err)
   
Handling run-time error: int division or modulo by zero

try-finally 语句

try-finally 语句无论是否发生异常都将执行最后的代码。

在这里插入图片描述

以下实例中 finally 语句无论异常是否发生都会执行:

try:
    runoob()
except AssertionError as error:
    print(error)
else:
    try:
        with open('file.log') as file:
            read_data = file.read()
    except FileNotFoundError as fnf_error:
        print(fnf_error)
finally:
    print('这句话,无论异常是否发生都会执行。')
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

三季人 G

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值