Bug:程序编写有问题造成的错误,称之为Bug.    debug:调试

注意:bug是程序本身有问题、有缺陷、系统漏洞

异常:完全无法在程序运行中预测的错误,例如写入文件的时候,磁盘满了,写不进去了,或者从网络抓取数据时,网络突然断掉了

try ……except……finally……

将某些可能会出错的代码,放置在try中来运行这段代码,如果执行错误,则该错误之后、except语句之前,这两个点之间的代码不会继续执行,而是直接跳转到except语句块,执行完except后,如果有finally语句块,则执行finally语句块,至此,执行完毕。

(1)如果没有错误发生,则except语句块不会被执行,可以在except语句块后面加一个else,当没有错误发生时,会自动执行else语句。

(2)finally语句块可有可无,但是如果有的话,则一定会被执行

(3)有多种不同类型的错误,应该有不同的except语句块处理。因此,可以有多个except语句块来捕获不同类型的错误。

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

(4)Python所有的错误都是从BaseException类派生的。

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

UnicodeError是ValueError的子类

BaseException
+-- SystemExit
+-- KeyboardInterrupt
+-- GeneratorExit
+-- Exception
+-- StopIteration
+-- StopAsyncIteration
+-- ArithmeticError
| +-- FloatingPointError
| +-- OverflowError
| +-- ZeroDivisionError
+-- AssertionError
+-- AttributeError
+-- BufferError
+-- EOFError
+-- ImportError
| +-- ModuleNotFoundError
+-- LookupError
| +-- IndexError
| +-- KeyError
+-- MemoryError
+-- NameError
| +-- UnboundLocalError
+-- OSError
| +-- BlockingIOError
| +-- ChildProcessError
| +-- ConnectionError
| | +-- BrokenPipeError
| | +-- ConnectionAbortedError
| | +-- ConnectionRefusedError
| | +-- ConnectionResetError
| +-- FileExistsError
| +-- FileNotFoundError
| +-- InterruptedError
| +-- IsADirectoryError
| +-- NotADirectoryError
| +-- PermissionError
| +-- ProcessLookupError
| +-- TimeoutError
+-- ReferenceError
+-- RuntimeError
| +-- NotImplementedError
| +-- RecursionError
+-- SyntaxError
| +-- IndentationError
| +-- TabError
+-- SystemError
+-- TypeError
+-- ValueError
| +-- UnicodeError
| +-- UnicodeDecodeError
| +-- UnicodeEncodeError
| +-- UnicodeTranslateError
+-- Warning
+-- DeprecationWarning
+-- PendingDeprecationWarning
+-- RuntimeWarning
+-- SyntaxWarning
+-- UserWarning
+-- FutureWarning
+-- ImportWarning
+-- UnicodeWarning
+-- BytesWarning
+-- ResourceWarning

(5)不需要在每个可能出错的地方去捕获错误,只要在合适的层次去捕获错误就可以了。

例如:foo(s)中的语句可能会出错,但是没有使用try语句块,这是因为在main函数中使用了try语句块,也能捕获该错误。

def foo(s):
return 10 / int(s) def bar(s):
return foo(s) * 2 def main():
try:
bar('')
except Exception as e:
print('Error:', e)
finally:
print('finally...')

调用栈

出错的时候,一定要分析错误的调用栈信息,才能定位错误的位置

Traceback (most recent call last): 这是错误的跟踪信息

记录错误

既然能通过try语句块来捕获错误,可以把错误原因打印出来,同时,让程序继续执行下去。

如何打印错误原因? 答:Python内置的logging模块可以非常容易地记录错误信息

通过配置,logging还可以把错误记录到日志文件里,方便事后排查

 #记录错误logging
#err_logging.py
import logging
def foo(s):
return 10/int(s) def bar(s):
return foo(s)*2 def main():
try:
bar('')
except Exception as e:
logging.exception(e) main()
print('END')

结论:可以看到,同样是出错,但程序打印完错误信息后会继续执行,并正常退出。

抛出错误,raise语句

格式:raise  错误类型() ,错误类型,即是参数

因为错误是class,捕获一个错误就是捕获到该class的一个实例。Python的内置函数会抛出很多类型的错误

只有在必要的时候才定义我们自己的错误类型。尽量使用Python内置的错误类型(如ValueError,TypeError)

 #抛出错误的另一种处理方式

 def foo(s):
n=int(s)
if n==0:
raise ValueError("invalid value:%s" % s)
return 10/n def bar():
try:
print('i am a good boy') #这句执行了
foo('s')
#执行这句时报错了,跳到except语句块,所以后面的语句就没有执行了
print('i am a good girl') #这句没有执行
except ValueError as e:
print('ValueError')
raise bar()

运行结果:

结论:1、可以看到程序执行到哪一句停止往下执行了

2、except语句块中raise后面没有任何参数,这种情况下,就会把当前错误原样抛出

最新文章

  1. .Net Globalization and Localization
  2. C#Winform连接Oracle数据库 , 及角色讲解
  3. 纯手工打造(不使用IDE)java web 项目
  4. hdu 1845
  5. 使用docker搭建nfs实现容器间共享文件
  6. 原生js记住密码
  7. PHP的GD库函数大全
  8. 【Stage3D学习笔记续】山寨Starling(七):一般优化方法简介及混合模式
  9. 用 Python 脚本实现对 Linux 服务器的网卡流量监控
  10. iOS真机调试配置
  11. 伸展树Splay【非指针版】
  12. Spring Cloud Alibaba基础教程:使用Nacos作为配置中心
  13. mysql常见的错误代码
  14. 通过Parcelable协议传递数据出现系列错误
  15. Java泛型初探
  16. docker动态绑定端口
  17. libcurl使用心得-包括下载文件不存在处理相关(转)
  18. PHP 日期的加减
  19. 用CI框架向数据库中实现简单的增删改查
  20. (转)使用Jquery+EasyUI进行框架项目开发案例讲解之一---员工管理源码分享

热门文章

  1. 【拆分版】Docker-compose构建Kibana单实例,基于7.1.0
  2. 『正睿OI 2019SC Day3』
  3. - Gradle 翻译 Analyzer APK文件分析 MD
  4. Winows上简单配置使用kafka(.net使用)
  5. Debian忘记密码重置
  6. intent 和 Broadcast Receiver之间的通信
  7. drf之组件(认证、权限、排序、过滤、分页等)和xadmin、coreapi
  8. Win10 资源管理器窗口无边框的问题
  9. SQL语句及数据库优化
  10. 关于js保留两位小数方法总结