python错误和异常
语法错误
能够被语法分析器找出来的错误
异常
语法是正确的,但是在运行过程中会出现的错误,称为异常。如算术错误
a = 1/0
错误信息会被打印出来,其中前面的部分显示异常发生的上下文,并以调用栈的形式显示具体信息。
异常处理
try/except
try:
执行代码
except:
发生异常时执行的代码
类似 java 中的 try-catch
- 在没有发生异常时忽略except子句,只执行try子句
- 如果try子句发生异常,则try余下的子句将会被忽略,如果发生的异常类型与 except之后的名称相符,name对应的except子句就会被执行
- 如果发生了异常,但是except后的异常类型不能与他相互匹配,则异常会传递给上一层 try 中
需要注意的是:
-
一个 try语句可以包含多个except子句,但最多只有一个except子句会被执行
-
一个except子句可以包含多个异常
-
最后一个except子句可以忽略异常的名称,它将被当做通配符使用,可以使用这个方法打印一个错误信息,并再次把异常抛出。
try: 执行语句 except (RuntimeError,TypeError): 出现异常后执行的代码 except NameError: pass except: print("Unexpected error:", sys.exc_info()[0]) raise # 抛出异常
try/except…else
try:
执行代码
except:
发生异常后执行的代码
else:
没有发生异常时执行的代码
值的注意的是:异常处理不仅仅处理那些直接发生在try子句中的异常,而且还能 处理子句中调用的函数(甚至间接调用的函数)里抛出的异常
try-finally
try:
执行代码
exception:
发生异常时执行的代码
else:
没有发生异常时执行的代码
finally:
不管有没有异常都会执行的代码
finally子句不管是否出现异常,在最后都会执行
抛出异常
python 使用raise
语句抛出一个指定的异常
raise [Exception [, args [, traceback]]]
x = 10
if x > 5:
raise Exception('x 不能大于5。x的值为:{}'.format(x))
raise 唯一的一个参数指定了要抛出的异常,它必须是一个异常的实例或者异常的类(也就是 Exception 的子类)
如果你只是想知道这是否抛出了一个异常,并不想处理它,name一个简单的 raise 语句可以再次将他抛出
自定义异常
可以通过创建一个新的异常类来拥有自己的异常,异常类继承自Excepton类,可以直接继承或间接继承
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)
Exception类默认的 __init__()
被覆盖,当创建一个模块可能抛出多种不同的异常时,一种通常的做法是为这个包建立一个基础异常类,然后基于该基础类为不同的错误情况创建不同的子类
class Error(Exception):
pass
class InputError(Error):
def __init__(self, expression, message):
self.expression = expression
self.message = message
大多数的异常名都以Error结尾,和标准的异常命名保持一致
定义清理行为
try语句的finally子句,无论在任何情况下都会执行,可以进行最后的清理行为。
如果一个异常在 try 子句中被抛出,而没有任何except把他捕获,那么这个异常在finally子句执行后会被抛出
预定义的清理行为
关键词
with
语句能够保证诸如文件之类的对象在使用完后一定会正确的执行他的清理方法
with open('myfile.txt') as f:
for line in f:
print(line,end=' ')
这段代码执行完毕后,就算过程出现问题,文件 f 总是会关闭
assert 断言
用于判断一个表达式,在表达式为False时,触发异常
断言可以在条件不满足程序运行的情况下直接返回错误,而不必等待程序运行错误后出现崩溃的情况。例如程序只能在 linux系统运行,可以先判断当前系统是否符合条件
assert expression
if not expression:
raise AssertionError
以上两段代码等价
assert expression[, arguments]
if not expression
raise AssertionError(arguments)
以上两段代码等价
关于 as 的用法
-
with...as...
语句,用于文件读写操作,省去关闭文件的步骤,自动清理。with open('1.txt') as f: print f.read()
-
与
except
结合使用,将捕获到的异常赋值给 eexcept Exception as e: print(e)
-
导入模块时对模块重命名,也就是起一个别名
import sys as System