Phthon学习---错误处理、调试和测试

try:
    print(‘try...‘)
    r = 10 / 0
    print(‘result:‘, r)
except ZeroDivisionError as e:
    print(‘except:‘, e)
finally:
    print(‘finally...‘)
print(‘END‘)

当我们认为某些代码可能会出错时,就可以用try来运行这段代码,如果执行出错,则后续代码不会继续执行,而是直接跳转至错误处理代码,即except语句块,执行完except后,如果有finally语句块,则执行finally语句块,至此,执行完毕。

使用try...except捕获错误还有一个巨大的好处,就是可以跨越多层调用,比如函数main()调用foo()foo()调用bar(),结果bar()出错了,这时,只要main()捕获到了,就可以处理。

Python内置的logging模块可以非常容易地记录错误信息:

# err_logging.py

import logging

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

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

def main():
    try:
        bar(‘0‘)
    except Exception as e:
        logging.exception(e)

import logging

s = ‘0‘
n = int(s)
logging.info(‘n = %d‘ % n)
print(10 / n)

logging.info()就可以输出一段文本。运行,发现除了ZeroDivisionError,没有任何信息。怎么回事?

别急,在import logging之后添加一行配置再试试:

import logging
logging.basicConfig(level=logging.INFO)

看到输出了:

$ python3 err.py
INFO:root:n = 0
Traceback (most recent call last):
  File "err.py", line 8, in <module>
    print(10 / n)
ZeroDivisionError: division by zero

这就是logging的好处,它允许你指定记录信息的级别,有debuginfowarningerror等几个级别,当我们指定level=INFO时,logging.debug就不起作用了。同理,指定level=WARNING后,debuginfo就不起作用了。这样一来,你可以放心地输出不同级别的信息,也不用删除,最后统一控制输出哪个级别的信息。

logging的另一个好处是通过简单的配置,一条语句可以同时输出到不同的地方,比如console和文件。

 

raise语句抛出一个错误的实例:

# err_raise.py
class FooError(ValueError):
    pass

def foo(s):
    n = int(s)
    if n==0:
        raise FooError(‘invalid value: %s‘ % s)
    return 10 / n
 
时间: 2024-10-06 03:50:35

Phthon学习---错误处理、调试和测试的相关文章

004-python面向对象,错误,调试和测试

---恢复内容开始--- 1.面向对象 面向对象编程——Object Oriented Programming,简称OOP,是一种程序设计思想.OOP把对象作为程序的基本单元,一个对象包含了数据和操作数据的函数. 数据封装.继承和多态是面向对象的三大特点 1.1类和实例 1.1.1 类 定义类是通过class关键字,class后面紧接着是类名,即Student,类名通常是大写开头的单词,紧接着是(object),表示该类是从哪个类继承下来的,通常,如果没有合适的继承类,就使用object类,这是

python学习笔记(八) - 错误、调试、测试

一.错误处理 1. 使用try .. exception .. finally try: print 'try...' r = 10 / 0 print 'result:', r # 出现异常不会打印这句话 except ZeroDivisionError, e: # 如果有异常就会被捕获到 print 'except:', e else: print 'no error!' # 如果没有异常就执行else finally: print 'finally...' # finally是肯定会执行的

Python学习笔记五:错误、调试和测试

1 # !/usr/bin/env python 2 # coding:utf-8 # 编码 3 4 'a test module' 5 6 __author__ = 'Sunflower' 7 8 9 # 异常错误类型 10 # AssertionError 断句错误 11 try: 12 my_list =['zhangsan'] 13 assert len(my_list) > 0 14 my_list.pop() 15 assert len(my_list) > 0 16 except

错误、调试和测试是怎样的

在程序运行过程中,总会遇到各种各样的错误. 有的错误是程序编写有问题造成的,比如本来应该输出整数,输出了字符串,这种错误我们称为bug,bug是必须修复的. 有的错误是用户输入造成的,比如让用户输入email地址,结果得到一个空字符串,这种错误可以通过检查用户输入来做相应的处理. 还有一类错误是无法在程序运行过程中预测的,比如写入文件的时候,磁盘满了,写不进去了,或者从网络抓取数据,网络突然断掉 这类错误也称之为异常,在程序中通常是必须处理的.否则,程序会因为各种问题终止并退出. python内

python,错误、调试和测试

在程序运行的过程中,如果发生了错误,可以事先约定返回一个错误代码,这样,就可以知道是否有错,以及出错的原因. try...except...finally... try: print('try...') r = 10 / int('2') print('result:', r) except ValueError as e: print('ValueError:', e) except ZeroDivisionError as e: print('ZeroDivisionError:', e)

二十八 错误、调试和测试

在程序运行的过程中,如果发生了错误,可以事先约定返回一个错误代码,这样,就可以知道是否有错,以及出错的原因.在操作系统提供的调用中,返回错误码非常常见.比如打开文件的函数open(),成功时返回文件描述符(就是一个整数),出错时返回-1. 用错误码来表示是否出错十分不便,因为函数本身应该返回的正常结果和错误码混在一起,造成调用者必须用大量的代码来判断是否出错: def foo(): r = some_function() if r==(-1): return (-1) # do somethin

Beaglebone Back学习六(Can总线测试)

Can总线测试 1 Can总线 控制器局域网 (Controller Area Network, 简称 CAN 或 CANbus)是一种通信协议,其特点是允许网络上的设备直接互相通信,网络上不需要主机(Host)控制通信.是由研发和生产汽车电子产品著称的德国BOSCH公司开发了的,并最终成为国际标准(ISO11898).CAN总线原理是通过CAN总线.传感器.控制器和执行器由串行数据线连接起来.它不仅仅是将电缆按树形结构连接起来,其通信协议相当于ISO/OSI参考模型中的数据链路层,网络可根据协

小白浅析软件中的错误以及调试

各位看官大牛你们好,我是一名it小白,今天想分享一下自己在学习工作中关于软件中错误以及调试的心得: 一般软件的错误可大致分为三类:1.编译错误    2.运行错误     3.逻辑错误. ①当发生编译错误时,代码是无法通过编译的,一般编译器会给出相应的提示,开发者可以根据编译器的报错提示进行修改即可,编译错误的特点是易发现.易修改. ②当发生运行错误时,代码是可以通过编译器编译的,但是会在程序运行中出现各种问题,发生这种问题的时候开发者需要在编译器的调试模式下进行断点调试,逐步运行到导致报错的语

C++ primer学习记录(个人猜想未测试版本)

学习版本:第五版. 本博文主要记录个人曾经并不知晓知识细节. 因为linux下的编译环境还未进行学习.所以实际代码测试将在今后完成. 红色:需确认. 蓝色:重点. 1)const对象设定为仅在文件内有效.个人认为:.h .cpp属于同文件的概念(未测试). 2)constexpr:常量表达式标示符.使用此作为前/后缀时,表示此变量/函数为常量表达式.但,具体用途?以及为何需要这样的标示符? 3)但凡使用迭代器的循环,都不要向迭代器增加元素.因为增加元素可能导致容器重新分配内存,导致后续迭代器操作