python错误处理之try...except...finally...错误处理机制。

今天学习了python的错误处理。

在程序处理的过程中,经常会出现错误,一旦出错就会非常麻烦。所以有的高级语言通常都内置了一套  try...exept...finaly...的错误处理机制,python也不例外。

下面有个try的例子:

try:
    print(‘try...‘)
    r = 10 / 0
    print(‘result:‘, r)
except ZeroDivisionError as e:
    print(‘except:‘, e)
finally:
    print(‘finally...‘)
print(‘END‘)因为10/0是错的,这时候try这一部分会执行错误,然后后续代码不会执行,会直接跳转至错误处理代码,即except语句块,执行完后如果有finally语句块就运行finally, 至此结束。

上面的这一段程序的运行结果为:
try...
except: division by zero
finally...
END由此可以看出r = 10/0后面的print(‘result:‘,r)没有运行,反而except捕捉到了错误所以输出
division by zero最后,finally被执行。

如果把上面的程序的“r = 10/0‘”改为“r = 10/5”则会输出:
try...
result: 2
finally...
END可以看出except没有被执行,但是finally是被执行了。

如果一段程序有多种语句上的错误,我们可以用不同的except语句处理。我们可以用多个except捕获程序里的多种错误。例:
try:
    print(‘try...‘)
    r = 10 / int(‘a‘)
    print(‘result:‘, r)
except ValueError as e:
    print(‘ValueError:‘, e)
except ZeroDivisionError as e:
    print(‘ZeroDivisionError:‘, e)
finally:
    print(‘finally...‘)
print(‘END‘)int()函数可能会执行ValueError,所以第一个except会捕获这个错值,另一个except捕获zerodivisionerror,此外如果没有错误我们可以在后面加一个else,没有错误会执行这个else语句。 例:
try:
    print(‘try...‘)
    r = 10 / int(‘2‘)
    print(‘result:‘, r)
except ValueError as e:
    print(‘ValueError:‘, e)
except ZeroDivisionError as e:
    print(‘ZeroDivisionError:‘, e)
else:
    print(‘no error!‘)
finally:
    print(‘finally...‘)
print(‘END‘)

python的错误也是class,所有的错误类型都继承自BaseException,各个类型的错误之间可能会存在继承关系,比如UnicodeError是ValueError的子类,如果catch语句中同时出现了这两个错误,且UnicodeError在ValueError的后面处理的,那么永远都捕获不到UnicodeError。

python中内置的常用错误类型继承关系:

使用try…excetp捕获错误一个好处是,可以跨层调用,比如main()调用foo(),foo()调用bar(),而错误是在bar中出现的,最后我们只需要在main()中捕获就行。

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

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

def main():
    try:
        bar(‘0‘)
    except Exception as e:
        print(‘Error:‘, e)
    finally:
        print(‘finally...‘)

也就是说,不需要在每个出错的地方捕获错误,只要在合适的的层次去捕获错误就行了。这样一来,就大大减少了写try...except...finally...的麻烦。

调用栈

如果错误没有被捕获,他就一直往上抛,最好被python解释器捕获,打印一个错误信息,然后程序退出。来看看err.py:

# err.py:
def foo(s):
    return 10 / int(s)

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

def main():
    bar(‘0‘)

main()
执行结果如下:
$ python3 err.py
Traceback (most recent call last):
  File "err.py", line 11, in <module>
    main()
  File "err.py", line 9, in main
    bar(‘0‘)
  File "err.py", line 6, in bar
    return foo(s) * 2
  File "err.py", line 3, in foo
    return 10 / int(s)
ZeroDivisionError: division by zero

出错并不可怕,可怕的不知道哪里出错了。解读信息是定位错误的关键。我们从上往下可以看到整个错误的调用函数链:错误信息第一行:
Traceback (most recent call last):

告诉我们这是错误的跟踪信息。第2~3行:
  File "err.py", line 11, in <module>
    main()调用main()出错了,在代码文件err.py的第11行代码,但原因是第9行:
  File "err.py", line 9, in main
    bar(‘0‘)调用bar(0)出错了,在代码文件err.py的第9行代码,但原因是第6行:
 File "err.py", line 6, in bar
    return foo(s) * 2
原因是return foo(s) * 2这个语句出错了,但这还不是最终原因,继续往下看:
 File "err.py", line 3, in foo
    return 10 / int(s)
原因是return 10 /int(s)这个语句出错了,这是错误产生的源头,因为下面打印了:
ZeroDivisionError: integer division or modulo by zero

根据错误类型zerodivisionerror,我们判断,int(s)本身并没有出错,但是int(s)返回0,在计算10/0时出错,至此,找到错源头。



 
 



原文地址:https://www.cnblogs.com/whrTC/p/9131319.html

时间: 2024-08-03 00:22:11

python错误处理之try...except...finally...错误处理机制。的相关文章

python manage.py shell之后的一些错误:

1. 在执行python manage.py shell之后的一些错误: [email protected]:~/myobject$ python manage.py shell /usr/lib/python2.7/dist-packages/pkg_resources.py:1049: UserWarning: /home/wyl/.python-eggs is writable by group/others and vulnerable to attack when used with

Python程序员的10个常见错误(转)

add by zhj:虽然学Python也有两年了,但这些问题的确容易犯,看来对Python的理解还有些地方不深入.先转了,有时间再好好看 译文:http://blog.jobbole.com/68256/ 本文由 伯乐在线 - datorhjaelten 翻译.未经许可,禁止转载!英文出处:toptal.欢迎加入翻译小组. 关于Python Python是一门解释性的,面向对象的,并具有动态语义的高级编程语言.它高级的内置数据结构,结合其动态类型和动态绑定的特性,使得它在快速应用程序开发(Ra

Python程序员的10个常见错误

关于Python Python是一门解释性的,面向对象的,并具有动态语义的高级编程语言.它高级的内置数据结构,结合其动态类型和动态绑定的特性,使得它在快速应用程序开发(Rapid Application Development)中颇为受欢迎,同时Python还能作为脚本语言或者胶水语言讲现成的组件或者服务结合起来.Python支持模块(modules)和包(packages),所以也鼓励程序的模块化以及代码重用. 关于本文 Python简单.易学的语法可能会误导一些Python程序员(特别是那些

python学习笔记系列----(六)错误和异常

python至少有2类不同的错误:语法错误(Syntax Errors)和异常(Exceptions). 8.1 语法错误 这个单词应该还是很有必要认识的,呵呵,语法错误,也叫解析错误,是我们最不愿意发生的错误,直接拿官网的例子: >>> while True print 'Hello world' File "<stdin>", line 1, in ? while True print 'Hello world' ^ SyntaxError: inva

python新手常犯的17个错误

1)忘记在 if , elif , else , for , while , class ,def 声明末尾添加 :(导致 "SyntaxError :invalid syntax") 该错误将发生在类似如下代码中: 1 2 if spam== 42 print('Hello!') 2) 使用 = 而不是 ==(导致"SyntaxError: invalid syntax") = 是赋值操作符而 == 是等于比较操作.该错误发生在如下代码中: 1 2 if spam

python&quot;TypeError: &#39;NoneType&#39; object is not iterable&quot;错误解析

尊重原创博主,原文链接:https://blog.csdn.net/dataspark/article/details/9953225 [解析] 一般是函数返回值为None,并被赋给了多个变量. 实例看下: c=0def test(): if c == 1: a = b = 1 return a, b a, b = test() 使用 a, b = test()调用时,就会报错:TypeError: 'NoneType' object is not iterable 在Python判断语句中,当

Python 3基础教程12-常见的错误

本文来介绍几种常见的错误,任何人在刚开始接触一个新的语言,即使照着代码抄写,也可能会犯错误,这里我们就介绍几种常见的错误,看看你是否遇到过. 1. NameError: name 'xxx' is not defined,变量声明错误 运行报错: 2. expected an indented block,代码行缩进错误 3. invalid syntax,语法错误 运行报错: EOF是End Of File的缩写 4. 非法字符 假如你写print语句中小括号用中文输入法打出来试试 原文地址:

PHP 错误与异常 笔记与总结(3)PHP 配置文件(php.ini)中与错误相关的选项 与 设置错误级别

[PHP 配置文件中与错误相关的选项 ] 选项 描述 error_reporting 设置错误报告的级别 display_errors 是否显示错误 log_errors 设置是否将错误信息记录到日志或者 error_log 中 error_log 设置脚本错误将记录到的文件 log_errors_max_len 设置 log_errors 的最大字节数 ignore_repeated_errors 是否忽略重复的错误信息 ignore_repeated_source 是否忽略重复错误消息的来源

MAC OSX 中解决编译“&#39;cc&#39; failed with exit status 1”错误 和clang: error: unknown argument 错误

错误例子: error: command 'cc' failed with exit status 1 clang: error: unknown argument: '-multiply_definedsuppress' [-Wunused-command-line-argument-hard-error-in-future] clang: note: this will be a hard error (cannot be downgraded to a warning) in the fu