为了更好的了解异常处理,可以查看官方文档,第八章。
The Python Tutorial
Errors and Exceptions
python -抛出异常raise、以及异常处理的else理解

在官方文档的documentation里面,我用的时python3.6.8,查看Tutorital.
python -抛出异常raise、以及异常处理的else理解

这个例子便于我们理解抛出异常,

python -抛出异常raise、以及异常处理的else理解

class B(Exception):
    pass

class C(B):
    pass

class D(C):
    pass
for cls in [B, C, D]:
    try:
        raise cls()
    except D:
        print("D")
    except C:
        print("C")
    except B:
        print("B")



输出:

B
C
D

直接看例子发现还有些难懂,我们举几个简单例子:

首先,try-except-finally与raise有什么区别?
#try…except…finally ===== 捕获异常
#raise ====== 抛出异常
举例:

age = int(input('age:'))
class AgeError(Exception):
    pass

if age < 0 or age > 120:
    raise AgeError	#抛出AgeError错误
else:
    print(age)

输出:

age:999
Traceback (most recent call last):
  File "/home/kiosk/Documents/python/python1231/回家练习/05抛出异常.py", line 14, in <module>
    raise AgeError
__main__.AgeError

改一下抛出的错误,错误叫Exception:

age = int(input('age:'))
class AgeError(Exception):
    pass

if age < 0 or age > 120:
    raise Exception
else:
    print(age)

输出:

age:999
Traceback (most recent call last):
  File "/home/kiosk/Documents/python/python1231/回家练习/05抛出异常.py", line 14, in <module>
    raise Exception
Exception

现在就好理解官方范例了,

class B(Exception):
    pass

class C(B):
    pass

class D(C):
    pass
for cls in [B, C, D]:
    try:
        raise cls() # 分别抛出BCD错误
    except D:       # 如果是D错误打印D
        print("D")
    except C:       # 如果是C错误打印C
        print("C")
    except B:       # 如果是B错误打印B
        print("B")

示例2:
理解异常处理的else

import sys
#/etc/passwd /etc/group
for arg in sys.argv[1:]:
    try:
        f = open(arg, 'r')
    except OSError:
        print('cannot open', arg)
    else:
        # 如果try语句中没有产生任何异常和错误, 才执行的语句;
        print(arg, 'has', len(f.readlines()), 'lines')
        f.close()

为了读懂上面代码,先学习一下sys模块。

import sys

print(sys.argv)
# argv是一个列表, 第一个元素是脚本名称,后面是脚本后传入的参数;
# ['06_sys模块获取脚本传入的参数.py', '1', '2', '3']

# print(sys.argv[1:]) 不打印脚本名称

python -抛出异常raise、以及异常处理的else理解

再回去看刚才的程序,

import sys
for arg in sys.argv[1:]:
    try:
        f = open(arg,'r') # 打开/etc/passwd
    except OSError: # 如果报错OSError 打印cannot open /etc/passwd
        print('cannot open ',arg)
    else:
        # 如果try语句中没有产生任何异常和错误, 才执行的语句;
        print(arg,'has',len(f.readlines()),'lines') # 打印/etc/passwd has xx lines
        f.close( )  # 关闭文档

按Alt + F12打开终端,当文件存在时:
python -抛出异常raise、以及异常处理的else理解文件不存在时,
python -抛出异常raise、以及异常处理的else理解

相关文章: