python基础语法9-异常处理

在刚学习python的时候,会经常因为各种各样的报错而奔溃,今天我们专门讲到python的异常诊断可以让你更快的找到问题出在哪里,怎么解决。python有两种错误很好找,那就是语法错误和异常。
一、异常的定义:
异常就是一个事件,该事件是在程序运行期检测到的错误,影响了程序的正常执行,即被称为异常
大多数的异常都不会被程序处理,如果我们不进行处理,就会导致程序的终止,然后都以错误信息的形式展现如下。
>>> 10 * (1/0)             # 0 不能作为除数,触发异常
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
ZeroDivisionError: division by zero
这就涉及到异常的处理。
二、异常捕捉:
1.捕捉异常可以使用try/except语句,语法规则如下:
try:
    <语句1>        #用try来检测语句1中的错误
except <名字1>:
    <语句2>        #如果在try部份引发了'名字1'异常
except <名字2>,<数据>:
    <语句3>        #如果引发了'名字2'异常,获得附加的数据
工作原理:
当开始一个 try 语句后,Python 就在当前程序的上下文中作标记,这样当异常出现时就可以回到这里,try 子句先执行,接下来会发生什么依赖于执行时是否出现异常
如果try里面的语句1发生异常,就会依次去except里执行匹配发生的异常,处理完成后控制流就通过整个 try 语句(除非在处理异常时又引发新的异常)
如果在 try 后的语句里发生了异常,却没有匹配的 except 子句,异常将被递交到上层的 try,或者到程序的最上层(这样将结束程序,并打印出错信息)
示例:
import sys
try:
    f = open('file.txt')
    s = f.readline()
    i = int(s.strip())
except OSError as err:
    print('os error:{0}'.format(err))
except ValueError:
    print("Could not convert data to an integer.")
except:
    print("Unexpected error:", sys.exc_info()[0])
    raise
注意:
try语句可能包含多个except子句,分别处理不同的特定的异常,最多只有一个分支会被执行。
一个except子句中可以同时处理多个异常,这些异常将被放在一个括号或者一个元组里。
如:
excpte (NameError,TypeError,...):
    pass

2.捕捉异常可以使用try/except...else语句,语法规则如下:
try:
    <语句1>        #用try来检测语句1中的错误
except <名字1>:
    <语句2>        #如果在try部份引发了'名字1'异常
except <名字2>,<数据>:
    <语句3>        #如果引发了'名字2'异常,获得附加的数据
else:
    <语句4>        #如果没有异常发生
工作原理:
当开始一个 try 语句后,Python 就在当前程序的上下文中作标记,这样当异常出现时就可以回到这里,try 子句先执行,接下来会发生什么依赖于执行时是否出现异常
如果try里面的语句1发生异常,就会依次去except里执行匹配发生的异常,处理完成后控制流就通过整个 try 语句(除非在处理异常时又引发新的异常)
如果在 try 后的语句里发生了异常,却没有匹配的 except 子句,异常将被递交到上层的 try,或者到程序的最上层(这样将结束程序,并打印缺省的出错信息)
如果在 try 子句执行时没有发生异常,Python 将执行 else 语句后的语句(如果有 else 的话),然后控制流通过整个 try 语句
示例:
import sys
for a in sys.argv[1:]:
    try:
        f = open(a,'r')
    except IOError:
        print('cannot open', a)
    else:
        print(a, 'has', len(f.readlines()), 'lines')
        f.close()
3.捕捉异常可以使用try/except...else...finally语句,语法规则如下:
try:
      code    #需要判断是否会抛出异常的代码,如果没有异常处理,python会直接停止执行程序
except:  #这里会捕捉到上面代码中的异常,并根据异常抛出异常处理信息
    #except ExceptionName,args:    #同时也可以接受异常名称和参数,针对不同形式的异常做处理
    code  #这里执行异常处理的相关代码,打印输出等
else:  #如果没有异常则执行else
    code  #try部分被正常执行后执行的代码
finally:
    code  #退出try语句块总会执行的程序
工作原理:
基本和上面讲到的一样,唯一不同的是不管又没有执行异常最后都会执行finally中的code
try:
    fib()
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('这句话,无论异常是否发生都会执行。')
三、触发异常:
python中使用raise来触发异常。
语法规则:
raise [Exception [, args [, traceback]]]
语句中 Exception 是异常的类型(例如,NameError)参数是一个异常参数值。该参数是可选的,如果不提供,异常的参数是"None"。
最后一个参数是可选的(在实践中很少使用),如果存在,是跟踪异常对象。
示例:
x = 10
if x>5:
    raise Exception('x 不能大于5, x的值是:{}'.format(x))
会触发如下异常:
Traceback (most recent call last):
  File "test.py", line 4, in <module>
    raise Exception('x 不能大于5, x的值是:{}'.format(x))
Exception: x 不能大于5, x的值是:10
四、用户自定义异常:
可以通过创建一个新的异常类来拥有自己的异常。异常类继承自 Exception 类,可以直接继承,或者间接继承。
示例:
class MyError(Exception):
    def __init__(self, value):
        self.value = value
    def __str__(self):
        return repr(self.value)
try:
    raise MyError(2*2)
except MyError as e:
    print('My exception occurred, value:', e.value)
结果:My exception occurred, value: 4
五、定义清理行为:
try语句中的子句还可以是无论任何情况下都会执行的清理行为。
示例:
try:
    raise KeyboardInterrupt
finally:
    print('Goodbye, world!')
结果:
Goodbye, world!
    raise KeyboardInterrupt
KeyboardInterrupt
示例:
def fun(x, y):
    try:
        r = x / y
    except ZeroDivisionError:
        print("division by zero!")
    else:
        print("result is", r)
    finally:
        print("executing finally clause")
fun(2,1)
fun(2,0)
fun('2','1')
六、预定义清理行为:
有些对象定义了标准的清理行为,无论系统是否成功的使用了它,一旦不需要它了,那么这个标准的清理行为就会执行。
示例:
for t in open("test.txt"):#代码执行完毕后test.txt文件始终保持打开状态,不会被关闭
    print(t, end="")
with open("test.txt") as f:#with关键语句在代码执行完毕test.txt文件后会自动关闭文件
    for t in f:
        print(t, end="")
以上的with语句关闭文件就是实现了文件清理的行为。
七、python的标准异常如下:
BaseException    所有异常的基类
SystemExit    解释器请求退出
KeyboardInterrupt    用户中断执行(通常是输入^C)
Exception    常规错误的基类
StopIteration    迭代器没有更多的值
GeneratorExit    生成器 (generator) 发生异常来通知退出
StandardError    所有的内建标准异常的基类
ArithmeticError    所有数值计算错误的基类
FloatingPointError    浮点计算错误
OverflowError    数值运算超出最大限制
ZeroDivisionError    除(或取模)零 (所有数据类型)
AssertionError    断言语句失败
AttributeError    对象没有这个属性
EOFError    没有内建输入,到达 EOF 标记
EnvironmentError    操作系统错误的基类
IOError    输入/输出操作失败
OSError    操作系统错误
WindowsError    系统调用失败
ImportError    导入模块/对象失败
LookupError    无效数据查询的基类
IndexError    序列中没有此索引(index)
KeyError    映射中没有这个键
MemoryError    内存溢出错误(对于 Python 解释器不是致命的)
NameError    未声明/初始化对象 (没有属性)
UnboundLocalError    访问未初始化的本地变量
ReferenceError    弱引用 (Weak reference) 试图访问已经垃圾回收了的对象
RuntimeError    一般的运行时错误
NotImplementedError    尚未实现的方法
SyntaxError    Python 语法错误
IndentationError    缩进错误
TabError    Tab 和空格混用
SystemError    一般的解释器系统错误
TypeError    对类型无效的操作
ValueError    传入无效的参数
UnicodeError    Unicode 相关的错误
UnicodeDecodeError    Unicode 解码时的错误
UnicodeEncodeError    Unicode 编码时错误
UnicodeTranslateError    Unicode 转换时错误
Warning    警告的基类
DeprecationWarning    关于被弃用的特征的警告
FutureWarning    关于构造将来语义会有改变的警告
OverflowWarning    旧的关于自动提升为长整型 (long) 的警告
PendingDeprecationWarning    关于特性将会被废弃的警告
RuntimeWarning    可疑的运行时行为 (runtime behavior) 的警告
SyntaxWarning    可疑的语法的警告
UserWarning    用户代码生成的警告

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

春风抚微霞

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

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

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

打赏作者

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

抵扣说明:

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

余额充值