Python错误和异常

语法错误

语法错误是指python编译器在编译时出现的错误,语法分析器会指出出错的一行并在最新出现问题的位置标记一个小箭头及错误提示

while True
    print('hello world')
File "..\haha.py", line 1
    while True
             ^
SyntaxError: invalid syntax  
函数 print() 被检查到有错误,是它前面缺少了一个冒号(:

异常

语法错误在编译的时候就会报出,但即便语法是正确的,在运行的时候也有可能发生错误,这种运行期检测到的错误称为异常,下面来几个示例:

#ZeroDivisionError
10 * (1/0)
Traceback (most recent call last):
  File "..\haha.py", line 1, in <module>
    10 * (1/0)
ZeroDivisionError: division by zero
[Finished in 0.2s]

#NameError
4 + spam*3
Traceback (most recent call last):
  File "..\haha.py", line 1, in <module>
    4 + spam*3
NameError: name 'spam' is not defined

#TypeError
'2' + 2
Traceback (most recent call last):
  File "..\haha.py", line 1, in <module>
    '2' + 2
TypeError: must be str, not int

异常处理

try:
    print('2' + 2)
except TypeError as err:
    print('type error:',err)
except NameError:
    print('name error')
except (RuntimeError, OSError, IOError):
	print('other error')
except: 
    print("Unexpected error:", sys.exc_info()[0]) 
    raise
else:
    print('no error preform else')
finally:
    print('must do finally')
 
结果打印:
type error: must be str, not int
must do finally

a.如果没有异常发生,忽略except子句,try子句执行后结束。

b.如果在执行try子句的过程中发生了异常,那么try子句余下的部分将被忽略。

c.如果异常的类型和 except 之后的名称相符,那么对应的except子句将被执行。
最后执行 try 语句之后的代码。

d.如果一个异常没有与任何的except匹配,那么这个异常将会传递给上层的try中。

e.一个try语句可能有多个except子句,处理不同的特定的异常。最多只有一个分支会被执行

f.一个except子句可以同时处理多个异常,这些异常将被放在一个括号里成为一个元组

g.如果前面的except类型都不相符,最后一个except可以忽略异常名称,
可以打印一个错误信息,然后再次把异常抛出

h.else子句,必须放在所有的except子句之后。在try子句没有发生任何异常的时候执行

i.不管 try 子句里面有没有发生异常,finally 子句都会执行

#使用raise抛出指定异常
raise NameError('this happen a name error')
Traceback (most recent call last):
  File "..\haha.py", line 1, in <module>
    raise NameError('this happen a name error')
NameError: this happen a name error

自定义异常类

创建一个新的异常类来拥有自己的异常。异常类继承自 Exception 类,可以直接继承,或者间接继承

class MyError(Exception):
        def __init__(self, value):
            self.value = value
        def __str__(self):
            return repr(self.value)

raise MyError('define my error')

执行结果:
Traceback (most recent call last):
  File "..\haha.py", line 7, in <module>
    raise MyError('define my error')
__main__.MyError: 'define my error'

预定义清理行为(with)

一些对象定义了标准的清理行为,无论系统是否成功的使用了它,一旦不需要它了,那么这个标准的清理行为就会执行

#for循环执行结束之后,myfile.txt并不会关闭
for line in open("myfile.txt")print(line, end="")
    
#使用with关键词
with open("myfile.txt") as f:
    for line in f:
        print(line, end='')
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值