错误
python有两种错误很容易辨认:语法错误和异常。
Python assert(断言)用于判断一个表达式,在表达式条件为 false 的时候触发异常
错误
语法错误:
>>>while True print('Hello world')
File "<stdin>", line 1, in ?
while True print('Hello world')
^
SyntaxError: invalid syntax
程序执行过程中,python解释器会检测你的程序是否存在语法错误,如果程序出错python解释器会指出出错的一行,并且在最先找到的 错误的位置标记了一个小小的箭头。这里函数 print() 被检查到有错误,是它前面缺少了一个冒号 :。
异常
异常
例子1:
>>> 1/0Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ZeroDivisionError: division by zero
在生活中0是不能作为被除数的,程序写的语法可能没问题,但是逻辑上不一定没有问题。
例子2:
>>> 4 + spam*3
Traceback (most recent call last):
File "<stdin>", line 1, in ?
NameError: name 'spam' is not defined
spam 未定义,触发异常
例子3:
>>> '2' + 2
Traceback (most recent call last):
File "<stdin>", line 1, in ?
TypeError: Can't convert 'int' object to str implicitly
int 不能与 str 相加,触发异常
异常以不同的类型出现,这些类型都作为信息的一部分打印出来: 例子中的类型有 ZeroDivisionError,NameError 和 TypeError。
异常处理
try/except
捕捉异常可以使用try/except语句。
try/except语句用来检测try语句块中的错误,从而让except语句捕获异常信息并处理。
如果你不想在异常发生时结束你的程序,只需在try里捕获它。
例子:
try:
print(2/0)
except ZeroDivisionError:
print( '除数不能为0')
捕捉多个异常
在一个except语句只捕捉其后声明的异常类型,如果可能会抛出的是其他类型的异常就需要再增加一个except语句了,或者也可以指定一个更通用的异常类型比如:Exception,如下:
try:
print( 2/'0')
except ZeroDivisionError:
print('除数不能为0')
except Exception:
print('其他类型异常')
为了捕获多个异常,除了声明多个except语句之外,还可以在一个except语句之后将多个异常作为元组列出来即可:
try:
print(2/'0')
except (ZeroDivisionError,Exception):
print( '发生了一个异常')
获取异常信息--as
每个异常都会有一些异常信息,一般情况下我们应该把这些异常信息记录下来:
try:
print( 2/'0')
except (ZeroDivisionError,Exception) as e:
# unsupported operand type(s) for /: 'int' and 'str'
print( e)
抛出异常
Python中的raise 关键字用于引发一个异常,raise关键字后面跟的是一个通用的异常类型(Exception),一般来说异常类型越详细越好。
def ThorwErr():
raise Exception("抛出一个异常")
# Exception: 抛出一个异常
ThorwErr()
Python在exceptions模块内建了很多的异常类型,通过使用dir函数来查看exceptions中的异常类型,如下:
import exceptions
# 结果是:['ArithmeticError', 'AssertionError'.....]
print dir(exceptions)
finally子句
finally子句和try子句联合使用,但是他和except语句不同,finally不管try子句内部是否有异常发生,都会执行finally子句内的代码。所有一般情况下,finally自己常常用于关闭文件或者在Socket中。
try:
print( 2/'0')
except (ZeroDivisionError,Exception):
print( '发生了一个异常')
finally:
print('不管是否发生异常都执行')
自定义异常类型
Python中也可以自定义自己的特殊类型的异常,只需要从Exception类继承(直接或间接)即可:
class SomeCustomException(Exception):
def __init__(self, arg):
self.args = arg
使用:
try:
raise SomeCustomException("exception info")
except SomeCustomException as e:
print ( e.args )
网友评论