python圣斗士修炼(十三):错误和异常处理

错误

我们执行程序的时候,难免会遇到错误。特别是刚开始学习的时候,会出现很多的语法错误,比如:

>>> while True print('Hello world')
  File "<stdin>", line 1, in ?
    while True print('Hello world')
                   ^
SyntaxError: invalid syntax

这个例子中,函数 print() 被检查到有错误,是它前面缺少了一个冒号(:)。

语法分析器指出了出错的一行,并且在最先找到的错误的位置标记了一个小小的箭头。

异常

但是很多情况下,我们程序出错不是因为语法错误而引起的,而是由于种种意想不到的原因造成的,这给我们的程序调试造成很大的麻烦,为了提高程序的容错性和方便调试,在某些特定的场合,我们 应该使用异常处理。比如:

py3风格的:
处理单个异常:
try:
    print('try...')
    r = 10 / 0
    print('result:', r)
except ZeroDivisionError as e:
    print('except:', e)
else: #没发生异常,就执行
    print('no error')
finally:
    print('finally...')
print('END')

py2风格:
try:
    f=open(filename,'r')
except IOError,e:
    return False,str(e)

try语句按照如下方式工作;
- 首先,执行try子句(在关键字try和关键字except之间的语句)
- 如果没有异常发生,忽略except子句,try子句执行后结束。
- 如果在执行try子句的过程中发生了异常,那么try子句余下的部分将被忽略。如果异常的类型和 except
之后的名称相符,那么对应的except子句将被执行。最后执行 try 语句之后的代码。
- 如果一个异常没有与任何的except匹配,那么这个异常将会传递给上层的try中。

同时处理多个异常:

try:
    process_some_data()
except (TypeError,ValueError) as reason:
    print ("ERROR:you proveide invalid data" +str(reason))
except EXception as reason:                          
    print ("unkownError",reason)

Exception是所有异常的根类,因此如果有异常没有被之前的任何except语句捕获到,那么该异常会在最后一个语句中被处理。

finally语句:

try:
    f=open(filename,'r')
except IOError,e:
    return False,str(e)
finally:
    print 1

无论异常是否发生,都会执行finally下的语句块。

抛出异常:

raise: 抛出异常。

def get_int(obj):
if not isinstance(obj,int):
raise TypeError(“get_int():must pass an integer”)
print %s is a int % obj

assert断言:

assert type(obj.name) is int  #只有这一句执行为真才往下执行。否则报错
print('ok')
assert A==B,A must == B

常见的异常关系:
https://docs.python.org/3/library/exceptions.html#exception-hierarchy

例子:对于一个文件,如果打开出错,而又想在finally中关闭该文件的句柄,那么会报错。处理方法如下:
try:
f = open(‘My_File.txt’) # 当前文件夹中并不存在”My_File.txt”这个文件T_T
print(f.read())
except OSError as reason:
print(‘出错啦:’ + str(reason))
finally:
if ‘f’ in locals(): # 如果文件对象变量存在当前局部变量符号表的话,说明打开成功
f.close()

自定义异常类


你可以通过创建一个新的exception类来拥有自己的异常。异常应该继承自 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
 raise MyError('oops!')
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
__main__.MyError: 'oops!'

附:
参考常见的异常关系: https://docs.python.org/3/library/exceptions.html#exception-hierarchy

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值