Python入门 六 错误异常处理,调试,测试程序

6.1 异常处理

        Python中使用try语句来处理异常,和其他语句一样,try也要使用缩进结构,try语句也有一个可选的else语句块。try语句结构如下

try:

        <语句(块)>

except<异常名1>:

        <语句(块)>

except <异常名2>:

        <语句(块)>

......

else:

      <语句(块)>

finally:

      <语句(块)>        

该语句的执行流程图如下

例子:

def testTry(index,flag=False):
    stulst={'John','Jenny','Tom'}
    if flag:
       try:
            astu=stulst[index]
       except IndexError:
            print("IndexError")

       return "Try Test Finished!"
    else:
        astu=stulst[index]
        return "No Try Test Finished!"


print("Right params testing start...")
print(testTry(1,True))
print(testTry(1,False))
print("Error params testing start...")
print(testTry(4,True))
print(testTry(4,False))

6.2 Python 主要的内置异常及其处理

        在python中常见的异常都已经预定义好了 如下:

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

 

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

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

例子:

def testTryAll(index,i):
    stulst=["John","Jenny","Tom"]
    try:
        print(len(stulst[index])/i)
    except:
        print("Error!")

print('Try all...Right')
testTryAll(1,2)
print('Try all...one Error')
testTryAll(1,0)
print('Try all...two Error')
testTryAll(4,0)

说明,代码中定义了函数 testTryAll, try语句中捕获了所有异常。第三次测试中发生了越界异常和除0异常。

例子2:

def testTryOne(index,i):
    stulst=["John","Jenny","Tom"]
    try:
        print(len(stulst[index])/i)
    except IndexError:
        print("Error!")

print('Try one...Right')
testTryOne(1,2)
print('Try one...one Error')
testTryOne(4,2)
print('Try one...one Error')
testTryOne(1,0)

代码中定义了方法testTryOne,其try语句中只捕获了指明的IndexError异常,因此当程序引发indexError时,程序不会中断,二挡引发除0异常时程序会中断。

 

6.3 手工抛出异常

6.3.1用raise手工抛出异常

        使用raise引发异常十分简单,raise有以下几种使用方式

  • raise 异常名
  • raise 异常名,附加数据
  • raise 类名

例子:

def testRaise():
    for i in range(5):
        try:
            if i==2:
                raise NameError
        except NameError:
            print('Raise a NameError')
        print(i)
print('end...')

testRaise()

6.3.2 assert 语句

assert语句一般形式如下:

assert<条件测试>,<异常附加数据>       #其中异常附加数据是可选的

assert语句时简化的raise,它引发异常的前提是其后面的条件测试为假

例子:

def testAssert():
    for i in range(3):
        try:
            assert i<2
        except AssertionError:
            print('Raise a AssertionError!')
        print(i)
    print('end...')

testAssert()

 

6.3.3 自定义异常类

        class MyError(Exception):            #继承Exception类

                 pass

实例:

class RangeError(Exception):
    
    def __init__(self,value):
        self.value=value

    def __str__(self):
        return self.value

raise RangeError('Range error!')

 

6.4.1调试语句块函数

        pdb模块中的调试语句块的函数及参数原型为:

         run(statement[,globals[, locals]])

  • statement              要调试的语句块,以字符串的形式表示
  • globals                   可选参数,设置statement运行的全局环境变量:
  • locals                      可选参数,设置statement运行的局部环境变量。

例子:

import pdb
pdb.run("""
for i in range(3):
    print(i)
""")

pdb交互命令

6.4.2 调试函数

       pdb模块中的调试函数应当调用模块中的runcall函数,

       runcall(function[,argument,...])

  • function       函数名:
  • argument    函数的参数

例子:

import pdb

def sum(maxint):
    s=0
    for i in range(maxint):
        s+=i
    return s

pdb.runcall(sum,10)

代码中调用pdb模块runcall函数来调试自定义函数sum,然后调用pdb.runcall对其进行交互调试

提示符中指明了运行的文件,函数及当前语句行内容,并且可以多次调用和调试

 

6.5.1   用testmod函数测试

        用testmod函数进行单元测试,就要将测试用例写入程序的docstring 中然后可以用两种方法进行测试。

例子:

(交互模式)

import pdb
defgrade(sum):
    """
    >>>grade(100)
    '优秀'
    >>>grade(65)
    '合格'
    >>> grade(10)
    '不合格'
    """
    if sum > 90:
        return '优秀'
    if sum >80:
        return '良'
    if sum >60:
        return '合格'
    if sum<60:
        return '不合格'

if name == '__main__':
    import doctest
    doctest.testmod()

 

6.5.2 用testfile函数测试

例子

import pdb

def grade(sum):
    if sum > 90:
        return '优秀'
    if sum >80:
        return '良'
    if sum >60:
        return '合格'
    if sum<60:
        return '不合格'

保存上述代码为文件 test.py

然后在交互中

    >>>grade(100)
    '优秀'
    >>>grade(65)
    '合格'
    >>> grade(10)
    '不合格'

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python提供了异常处理机制来处理程序中的错误和异常。异常处理机制涉及到以下关键字和语句:try、except、else、finally和raise。 1. try-except语句用于捕获和处理异常。在try块中,我们可以放置可能会引发异常的代码。如果try块中的代码引发了异常,那么程序将跳转到对应的except块,并执行其中的代码来处理异常。except块可以指定捕获特定类型的异常,也可以使用通用的异常类型来捕获所有异常。 2. else语句在try块中的代码没有引发异常时执行。如果try块中的代码没有引发异常,那么程序将跳过except块,直接执行else块中的代码。 3. finally语句用于定义无论是否发生异常都要执行的代码。无论try块中的代码是否引发异常,finally块中的代码都会被执行。 4. raise语句用于手动引发异常。我们可以使用raise语句来主动抛出异常,从而中断程序的正常执行流程。 以下是一个示例,演示了Python程序异常处理的基本用法: ```python try: # 可能引发异常的代码 num1 = int(input("请输入一个整数: ")) num2 = int(input("请输入另一个整数: ")) result = num1 / num2 print("结果为:", result) except ValueError: # 处理值错误异常 print("输入的不是有效的整数") except ZeroDivisionError: # 处理除零异常 print("除数不能为零") except Exception as e: # 处理其他异常 print("发生了一个异常:", str(e)) else: # 没有发生异常时执行的代码 print("没有发生异常") finally: # 无论是否发生异常都会执行的代码 print("程序结束") ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值