python 错误、异常
博客专区 > clgo 的博客 > 博客详情
python 错误、异常
clgo 发表于2年前
python 错误、异常
  • 发表于 2年前
  • 阅读 1
  • 收藏 0
  • 点赞 1
  • 评论 0

新睿云服务器60天免费使用,快来体验!>>>   

python错误分为两种:

1.语法错误:语法错误是程序编写有问题造成的,比如本来应该输入整数结果输入了字符串,这种错误我们通常称之为bug,bug是需要在程序执行前纠正的。 2.异常:异常是完全无法在程序运行过程中预测的,对异常的描述是:因程序出现错误而在正常的控制流外采取的行为。如写入文件的时候,磁盘满了,写不进去了,或者从网络抓取数据,网络突然断掉了。这类错误也称为异常,在程序中通常是必须处理的,否则,程序会因为各种问题终止并退出。

错误处理:

1.包括python在内的高级语言通常都内置了一套try...except...finally...的错误处理机制错误。 try

try的使用例子:

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

当某些代码容易出错时,就可以用try来运行这段代码, 1.如果执行出错,则后续代码不会继续执行,而是直接跳转至错误处理代码,即except语句块,执行完except后,如果有finally语句块,则执行finally语句块,至此,执行完毕。 2.如果没有错误发生,所以except语句块不会被执行,但是finally如果有,则一定会被执行(可以没有finally语句)。 注:无论是否有错误,如果存在finally语句,则一定会执行。

2.错误和异常小结

  1. 异常 描述
  2. NameError 尝试访问一个没有申明的变量
  3. ZeroDivisionError 除数为0
  4. SyntaxError 语法错误
  5. IndexError 索引超出序列范围
  6. KeyError 请求一个不存在的字典关键字
  7. IOError 输入输出错误(比如你要读的文件不存在)
  8. AttributeError 尝试访问未知的对象属性
  9. ValueError 传给函数的参数类型不正确,比如给int()函数传入字符串形

3.使用try...except捕获错误还有一个好处,就是可以跨越多层调用,比如函数main()调用foo(),foo()调用bar(),结果bar()出错了,这时,只要main()捕获到了,就可以处理:也就是说,不需要在每个可能出错的地方去捕获错误,只要在合适的层次去捕获错误就可以了。可以减少写try语句的次数。

此时:如果在内层中错误没有被捕获,它就会一直往上层抛,最后被Python解释器捕获,打印一个错误信息,然后程序退出。上面的例子就会由bar()--foo()--main()。

4.记录错误 Python内置的logging模块可以非常容易地记录错误信息,通过配置,logging可以把错误记录到日志文件里,方便事后排查。

如果不捕获错误,自然可以让Python解释器来打印出错误堆栈,但程序也被结束了。既然我们能捕获错误,就可以把错误堆栈打印出来,然后分析错误原因,同时,让程序继续执行下去。

import logging

def foo(s):
    return 10 / int(s)

def bar(s):
    return foo(s) * 2

def main():
    try:
        bar('0')
    except StandardError, e:
        logging.exception(e)

main()
print 'END'

同样是出错,但程序打印完错误信息后会继续执行,并正常退出:

$ python err.py
ERROR:root:integer division or modulo by zero
Traceback (most recent call last):
  File "err.py", line 12, in main
    bar('0')
  File "err.py", line 8, in bar
    return foo(s) * 2
  File "err.py", line 5, in foo
    return 10 / int(s)
ZeroDivisionError: integer division or modulo by zero
END

5.触发异常,抛出错误: 错误是class定义的,捕获一个错误就是捕获到该class的一个实例。因此错误是自定义的并在合适的条件下抛出的。Python的内置函数会抛出很多类型的错误,我们自己编写自定义的异常触发(抛出错误)。

如果要抛出错误,首先根据需要,可以定义一个错误的class,选择好继承关系,然后,用raise语句抛出一个错误的实例:

class FooError(StandardError):
    pass

def foo(s):
    n = int(s)
    if n==0:
        raise FooError('invalid value: %s' % s)
    return 10 / n

执行,可以最后跟踪到我们自己定义的错误:

$ python err.py
Traceback (most recent call last):
  ...
__main__.FooError: invalid value: 0

只有在必要的时候才定义我们自己的错误类型。如果可以选择Python已有的内置的错误类型(比如ValueError,TypeError),尽量使用Python内置的错误类型。

  • 打赏
  • 点赞
  • 收藏
  • 分享
共有 人打赏支持
粉丝 1
博文 88
码字总数 34810
×
clgo
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: