10、Python中的错误和异常

1、错误

  • 拼写错误, 即关键字、函数名或变量名拼写错误;关键字拼写错误时会提示SytaxError,而变量名、函数名拼写错误会提示NameError;
  • 程序不符合Python的语法规范,缺少括号、冒号、表达式错误等等;
  • 缩进错误,一般来说Python以4个空格为缩进;

2、异常

异常是Python程序在运行中引发的错误。如果程序中发生了未进行处理的异常,脚本就会由于异常而终止运行;只有捕获这些异常,并进行相关处理,才能使程序不会中断运行;

  • try方法处理异常
  • Python内置异常及处理
  • rais手工抛出异常
  • assert语句
  • 自定义异常

(1)、try方法处理异常

python中使用try方法处理异常,一般的try语句基本形式如下:

try:
    <语句(块)>                # 可能产生异常的语句(块)
except <异常名1>:               # 要处理的异常
    <语句(块)>                # 异常处理语句
except <异常名2>:
    <语句(块)>
else:
    <语句(块)>                # 未触发异常则执行该语句(块)
finally:                        
    <语句(块)>                # 始终执行该语句

常用的形式有如下两种形式:
形式一:

try:
    <语句(块)>                # 可能产生异常的语句(块)
except <异常名1>:               # 要处理的异常
    <语句(块)>                # 异常处理语句

形式二:

try:
    <语句(块)>                # 可能产生异常的语句(块)
except <异常名1>:               # 要处理的异常
    <语句(块)>                # 异常处理语句
finally:                        
    <语句(块)>                # 始终执行该语句

try方法处理异常示例:

def tryFunction(n):
    lst = [1, 2, 3, 4, 5]
    try:
        a = lst[n]
    except IndexError:
        return 'Index Error'
    else:
        return a

print(tryFunction(2))
print(tryFunction(12))

运行结果:
3
Index Error


(2)、Python内置异常及处理

在交互环境中,使用dir(__builtins__)命令,就会显示出所有的预定义异常;

常见的异常定义如下表所示:

异常名 描述
AttributeError 调用不存在的方法引起异常
EOFError 遇到文件默尾引发的异常
ImportError 导入模块出错引发的异常
IndexError 列表越界引发的异常
IOError I/O操作引发的异常,如打开文件出错
KeyError 使用字典不存在的关键字引发的异常
NameError 使用不存在的变量名引发的异常
TabError 语句块缩进不正确引发的异常
ValueError 搜索列表中不存在的值引发的异常
ZeroDivisionError 除数为0引发的异常

except语句主要用法有一下几种:

  • except: 捕获所有的异常;
  • except<异常名>:捕获指定异常;
  • except(异常名1,异常名2): 捕获异常1或异常2;
  • except<异常名> as <数据>: 捕获指定异常及其附加数据;
  • except(异常名1,异常名2) as <数据> : 捕获异常1或异常2及其附加数据

except示例:

def testExcept(index, i):
    lst = [1, 2, 3, 4, 5]
    try:
        result = lst[index] / i
    except:
        print('Error!')
    else:
        print('The Result Is', result)

testExcept(2, 2)
testExcept(2, 0)
testExcept(12, 0)

运行结果:
The Result Is 1.5
Error!
Error!


(3)、raise手工抛出异常

使用raise抛出异常的方式有如下几种:

  • raise 异常名
  • raise 异常名,附加数据
  • raise 列明

raise抛出异常示例:

def testExcept(index, i):
    lst = [1, 2, 3, 4, 5]
    if len(lst) <= index:
        raise IndexError
    else:
        print('The Result Is', lst[index])
'''
    except IndexError:
        print('Index Error!')

    else:
        print('The Result Is', result)
'''

#testExcept(2, 2)
testExcept(5, 2)

运行结果:
Traceback (most recent call last):
File “G:\work\python\01Python爬虫基础\postTest.py”, line 33, in
testExcept(5, 2)
File “G:\work\python\01Python爬虫基础\postTest.py”, line 21, in testExcept
raise IndexError
IndexError

处理raise手工抛出的异常示例:

def testExcept(index, i):
    lst = [1, 2, 3, 4, 5]
    try:
        if len(lst) <= index:
            raise IndexError
    except IndexError:
        print('Index Error!')
    else:
        print('The Result Is', lst[index])

testExcept(2, 2)
testExcept(5, 2)

运行结果:
The Result Is 3
Index Error!


(4)、assert语句

assert语句的一般形式如下:

assert<条件测试>,<异常附加数据>

  • 其中异常附加数据是可选的,当测试条件为False时,引发异常;
  • assert会抛出AssertionError异常;
  • 只有python的内置特殊变量__debug__为True时才运行

assert语句示例:

def testAssert(i):
    try:
        assert i < 2        # 当 i >= 2时抛出异常AssertionError
    except AssertionError:
        print('Assertion Error!')
    else:
        print('i is', i)

testAssert(1)
testAssert(2)

运行结果:
i is 1
Assertion Error!


(5)、自定义异常

  • Python中的自定义异常至于要继承Exception类
  • 如果需要在异常中含有一定的提示信息,可以重载__init__和__str__函数

自定义异常示例:

class MyException(Exception):
    def __init__(self, value):
        self.value = value;
    def __str__(self):
        return self.value

raise MyException('Myself Exception!')

运行结果:
Traceback (most recent call last):
File “G:\work\python\01Python爬虫基础\postTest.py”, line 24, in
raise MyException(‘Myself Exception!’)
__main__.MyException: Myself Exception!

猜你喜欢

转载自blog.csdn.net/douzhq/article/details/79339348