Python基础之bug异常

什么是异常

在程序运行过程中,总会遇到各种各样的错误。

有的错误是程序编写有问题造成的,比如本来应该输出整数结果输出了字符串,这种错误我们通常称之为bugbug是必须修复的。

异常即是一个事件,该事件会在程序执行过程中发生,影响了程序的正常执行。

一般情况下,在Python无法正常处理程序时就会发生一个异常。

异常是Python对象,表示一个错误。

Python脚本发生异常时我们需要捕获处理它,否则程序会终止执行。

常见异常

异常名称描述
ZeroDivisionError除(或取模)零 (所有数据类型)
IndexError序列中没有此索引(index)
KeyError映射中没有这个键
NameError未声明/初始化对象 (没有属性)
SyntaxError可疑的语法的警告
ValueError传入无效的参数
IOError输入/输出操作失败

不同异常的处理方式

raise触发异常

可以使用raise语句自己触发异常。raise语法格式raise [Exception [, args [, traceback]]]

def functionName( level ):
    if level < 1:
        raise Exception("Invalid level!", level)
        # 触发异常后,后面的代码就不会再执行

try-except-finally异常处理机制

捕捉异常可以使用try/except语句。

try/except语句用来检测try语句块中的错误,从而让except语句捕获异常信息并处理。

如果你不想在异常发生时结束你的程序,只需在try里捕获它。

try:
    print('try...')
    r = 10 / 0
    print('result:', r)
except ZeroDivisionError as e:
    print('except:', e)
finally:
    print('finally...')
print('END')

当我们认为某些代码可能会出错时,就可以用try来运行这段代码,如果执行出错,则后续代码不会继续执行,而是直接跳转至错误处理代码,即except语句块,执行完except后,如果有finally语句块,则执行finally语句块,至此,执行完毕。

使用多个except来捕捉异常

错误应该有很多种类,如果发生了不同类型的错误,应该由不同的except语句块处理。可以有多个except来捕获不同类型的错。

try:
    print('try...')
    r = 10 / int('a')
    print('result:', r)
except ValueError as e:
    print('ValueError:', e)
except ZeroDivisionError as e:
    print('ZeroDivisionError:', e)
finally:
    print('finally...')
print('END')

捕获异常的顺序可以按照先子类后父类的顺序,为了避免遗漏可能出现的异常,可以在最后增加BaseException

try:
    a=int(input('请输入第一个整数'))
    b=int(input('请输入第二个整数'))
    result=a/b
    print('结果为:',result)
except ZeroDivisionError:
    print('对不起,除数不允许为0')
except ValueError:
    print('只能输入数字串')
except BaseException:
    print('出现错误')
print('程序结束')

使用except而带多种异常类型

可以使用相同的except语句来处理多个异常信息。

try:
    正常的操作
   ......................
except(Exception1[, Exception2[,...ExceptionN]]):
   发生以上多个异常中的一个,执行这块代码
   ......................
finally:
    如果没有异常执行这块代码

使用except而不带任何异常类型

也可以不带任何异常类型使用except,这样try-except语句捕获所有发生的异常。但这不是一个很好的方式,我们不能通过该程序识别出具体的异常信息。因为它捕获所有的异常。

try:
    正常的操作
   ......................
except:
    发生异常,执行这块代码
   ......................
finally:
    如果没有异常执行这块代码

try-finally 语句

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

try:
	<语句>
finally:
	<语句>    #退出try时总会执行
'''''''''''''''''''''''''''''''''''''''''''''''''''''
try:
    fh = open("testfile", "w")
    fh.write("这是一个测试文件,用于测试异常!!")
finally:
    print "Error: 没有找到文件或读取文件失败"

try-except-else结构

如果try块中没有异常抛出,执行else块,如果try中有异常,则执行except块中代码。

try:
    a = int(input('请输入第一个整数'))
    b = int(input('请输入第二个整数'))
    result = a / b
except BaseException as e:
    print('出错了',e)
else:
    print('计算结果为:',result)
finally:
    print('谢谢您的使用')

自定义异常

通过创建一个新的异常类,程序可以命名它们自己的异常。异常应该是典型的继承自Exception类,通过直接或间接的方式。

try语句块中,用户自定义的异常后执行except块语句,变量 e是用于创建Networkerror类的实例。

class Networkerror(RuntimeError):
    def __init__(self, arg):
        self.args = arg
#--------------------------------------------------
try:
    raise Networkerror("Bad hostname")
except Networkerror,e:
    print e.args

如有疑问,欢迎留言讨论。
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

一个小坑货

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

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

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

打赏作者

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

抵扣说明:

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

余额充值