Python学习:错误与异常

简介: 使用try...except可以处理异常

使用try...except可以处理异常

异常处理

import sys
try:
    print('try...')
    r = 10/0
    print('result:',r)
except ZeroDivisionError as e:#
    print('except:',e)
finally:
    print('finally...')
print('end')

输出

try...
except: division by zero
finally...
end

如果在try语句块中出现错误,剩下try部分剩下的语句不会继续被执行

如果异常类型和except之后的名称相符,就会执行对应的except下的语句

如果有finally语句块,则执行finally语句块,至此,执行完毕

把0改成2,由于没有错误发生,except部分会不执行,但是finally如果有,则一定会被执行(可以没有finally语句)

捕获多个异常

try:
    print('try...')
    r = 10/int('a')
    print('result:',r)
except ValueError as e:
    print('ValueError:',e)
except ZeroDivisionError as e :
    print('ZeroDivisionError:',e)
print('finally')

输出

try...
ValueError: invalid literal for int() with base 10: 'a'
finally

int()函数可能会抛出ValueError,所以我们用一个except捕获ValueError,用另一个except捕获ZeroDivisionError

一个try语句可能有多个except子句,分别来处理不同的异常

except (RuntimeError,TypeError,NameError):
#    pass

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

可以在except后面加个else,当没有错误发生的时候,会自动执行else语句

for arg in sys.argv[1:]:
    try:
        f = open(arg, 'r')
    except IOError:
        print('cannot open', arg)
    else:
        print(arg, 'has', len(f.readlines()), 'lines')
        f.close()

使用 else 子句比把所有的语句都放在 try 子句里面要好,这样可以避免一些意想不到的、而except又没有捕获的异常

异常处理并不仅仅处理那些直接发生在try子句中的异常,而且还能处理子句中调用的函数(甚至间接调用的函数)里抛出的异常

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...')

函数main()调用foo(),foo()调用bar(),结果bar()出错了,这时,只要main()捕获到了,就可以处理:

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

Python的错误其实也是class,所有的错误类型都继承自BaseException,所以在使用except时需要注意的是,它不但捕获该类型的错误,还把其子类也“一网打尽”

try:
    foo(2)
except ValueError as e:
    print('ValueError')
except UnicodeError as e:
    print('UnicodeError')

第二个except永远也捕获不到UnicodeError,因为UnicodeError是ValueError的子类,如果有,也被第一个except给捕获了

抛出异常

使用raise语句可以抛出一个指定的异常

try:
    raise NameError('HiThere')
except NameError:
    print('An exception flew by!')
    raise

raise 唯一的一个参数指定了要被抛出的异常。它必须是一个异常的实例或者是异常的类(也就是 Exception 的子类)

只想知道这是否抛出了一个异常,并不想去处理它,那么一个简单的 raise 语句就可以再次把它抛出

相关文章
|
5天前
|
数据处理 索引 Python
【Python学习篇】Python实验小练习——文件操作(十一)
【Python学习篇】Python实验小练习——文件操作(十一)
17 1
|
5天前
|
存储 缓存 算法
【Python学习篇】Python实验小练习——循环结构(八)
【Python学习篇】Python实验小练习——循环结构(八)
9 1
|
5天前
|
存储 算法 数据安全/隐私保护
【Python学习篇】Python实验小练习——高级数据结构(五)
【Python学习篇】Python实验小练习——高级数据结构(五)
19 1
|
5天前
|
存储 Python
【Python学习篇】Python判断语句(四)
【Python学习篇】Python判断语句(四)
12 1
|
3天前
|
机器学习/深度学习 人工智能 数据挖掘
从零开始学习Python编程语言
本文将介绍Python编程语言的基础知识和学习路径,帮助初学者快速入门,并为进阶学习提供指引。首先,我们将讨论Python的特点和应用领域,然后深入探讨Python的基础语法、常用数据类型和控制流程,最后介绍如何利用Python进行简单的编程实践。
|
5天前
|
存储 Python Windows
【Python学习篇】Python实验小练习——函数(十)
【Python学习篇】Python实验小练习——函数(十)
7 1
|
5天前
|
存储 Python
【Python学习篇】Python——函数(九)
【Python学习篇】Python——函数(九)
10 1
|
5天前
|
算法 Python Windows
【Python学习篇】Python实验小练习——选择结构(七)
【Python学习篇】Python实验小练习——选择结构(七)
12 1
|
5天前
|
Python
【Python学习篇】Python——循环语句(六)
【Python学习篇】Python——循环语句(六)
10 1
|
5天前
|
存储 Python Windows
【Python学习篇】Python实验小练习(三)
【Python学习篇】Python实验小练习(三)
9 1