码迷,mamicode.com
首页 > 其他好文 > 详细

异常与错误

时间:2018-08-22 22:49:44      阅读:229      评论:0      收藏:0      [点我收藏+]

标签:数据库连接   粘贴   运行时   别人   except   结果   有用   类型   注意   

一.异常和错误
什么是错误
  • 语法错误
    • 无法通过python解释器的语法检测
    • 在写代码的时候应该规避掉
  • 逻辑错误
 
什么是异常
  • 程序运行时发生错误的信号
 
什么时候容易发生异常
  • 当要处理的内容不确定的时候
    • 有用户参与
    • 有外接数据接入: 从文件中读 , 从网络上获取等
 
异常信息的查看
 
技术分享图片
 
当有多行报错的时候是为什么
在嵌套调用的过程中, 内部的代码出了问题, 外部所有的调用的地方都成为报错追溯信息的一部分.
 
如何解决
从下往上找, 首先找到出错的那一行代码, 如果能看出问题, 就直接解决
不能, 就把报错的最后一行, 错误类型和详细提示贴到百度里, 结合报错的那一行去处理
 
def func1():
    name
def func2():
    func1()
def main():
    func2()
main()
 
错误信息:
Traceback (most recent call last):
  File "G:/utilities/Python/Python36/projects36/day20/4.异常基础处理.py", line 7, in <module>
    main()
  File "G:/utilities/Python/Python36/projects36/day20/4.异常基础处理.py", line 6, in main
    func2()
  File "G:/utilities/Python/Python36/projects36/day20/4.异常基础处理.py", line 4, in func2
    func1()
  File "G:/utilities/Python/Python36/projects36/day20/4.异常基础处理.py", line 2, in func1                        # 这一行是问题的源头
    name
NameError: name ‘name‘ is not defined                    # 如果无法解决, 就将该行信息粘贴到百度去处理
 
二.异常处理
1.什么是异常
  • 程序运行时发生错误的信号
  • 异常之后的代码就不执行了
 
2.什么是异常处理
  • python解释器检测到错误, 触发异常
  • 程序员编写特定的代码, 专门用来捕捉这个异常
  • 如果捕捉成功则进入另外一个处理分支, 执行你为其定制的逻辑, 使程序不会崩溃, 这就是异常处理
 
3.为什么要进行异常处理
python解释器去执行程序, 检测到了一个错误时, 触发异常, 异常触发后且没被处理的情况下, 程序就在当前异常处终止, 后面的代码不会运行, 非常非常影响用户体验
需要提供一种异常处理机制来增强你程序的健壮性与容错性
 
4.如何进行异常处理
首先须知, 异常是有程序的错误引起的, 语法上的错误跟异常处理无关, 必须在程序运行前就处理
 
5.异常处理的几种写法
 
单分支
try:
    被检测的代码块
except 异常类型:
    try中一旦检测到此处的异常类型, 就执行这里的逻辑
 
多分支
try:
    被检测的代码块
except 异常类型1:
    try中一旦检测到此处的异常类型, 就执行这里的逻辑
except 异常类型2:
    try中一旦检测到此处的异常类型, 就执行这里的逻辑
except ...
 
注: 
1. 报错的代码信息会从上向下进行查找, 只要找到和报错类型相符的分支, 就停止查找, 执行这个分支中的代码, 然后直接退出分支
2. 如果找不到能处理和报错类型相同的分支, 会一直往下走, 最后还是没有找到就会报错
 
多分支合并
try:
    被检测的代码块
except (异常类型1, 异常类型2, 异常类型3, ...):
    try中一旦检测到此处的异常类型, 就执行这里的逻辑
 
万能异常
# 写法一:
try:
    被检测的代码块
except Exception:
    try中出现的所有异常, 都会执行这里的逻辑
 
 
# 写法二:
try:
    被检测的代码块
except:
    try中出现的所有异常, 都会执行这里的逻辑
 
注:
不会打印错误的信息
 
as语法
  • 常和万能异常搭配使用
  • 其他单分支或多分支等也是都可以使用的
try:
    name
except Exception as e:        # 这里的e就是一个变量, 写什么都可以
    print(e)                              # 打印错误信息
 
注:
Exception 使用as语法, 用来打印错误信息
 
多分支 + 万能异常
try:
    被检测的代码块
except 异常类型1:
    try中一旦检测到此处的异常类型, 就执行这里的逻辑
except 异常类型2 as e:                                                        # 这里也可以使用as语法的哦!
    try中一旦检测到此处的异常类型, 就执行这里的逻辑
except Exception as e:
    print(e)
    不满足上面的异常类型时, 都会执行这里的逻辑
 
注: 
万能异常永远在异常处理的最下面
 
else分支
try:
    被检测的代码块
except 异常类型:
    try中一旦检测到此处的异常类型, 就执行这里的逻辑
else:
    当try中代码不发生异常的时候, 走else分支
 
注: 应用场景
发邮件, 当网络稳定的时候或邮箱地址错误时, 重新发送
当发送成功时, 进行后续的处理
 
finally分支
try:
    被检测的代码块
except 异常类型1:
    try中一旦检测到此处的异常类型, 就执行这里的逻辑
except 异常类型2:
    try中一旦检测到此处的异常类型, 就执行这里的逻辑
except Exception as e:
    print(e)
    不满足上面的异常类型时, 都会执行这里的逻辑
else:
    当try中代码不发生异常的时候, 走else分支
finally:
    无论如何都会被执行
 
应用场景:
例如打开一个文件操作, 如果文件打开了在操作的过程中, 出现问题, 有finally那文件就可以被关闭; 没有出现问题, 文件也会被关闭.
所以, finally可以用来回收一些操作系统的资源: 数据库连接, 打开的文件句柄, 网络连接等
 
注: 
1. 有finally时, finally在最下面
2. 注意这里写的顺序
 
6.其他操作
6.1主动抛出异常
raise
  • 这个是给其他开发者用的, 而不是给用户抛的
  • 例如:我们使用别人开发的框架, 在使用时可以给我们主动抛出异常让我们处理, 而我们开发完毕的程序, 是不能抛出异常给用户看的, 这样是很不友好的
 
raise ValueError(‘你写的不对呀!‘)
 
结果:
ValueError: 你写的不对呀!
 
6.2断言
assert
 
assert 1 == 1        # 条件成立, 程序继续往下执行
 
assert 1 == 2        # 条件不成立, 程序不会继续往下执行

 

异常与错误

标签:数据库连接   粘贴   运行时   别人   except   结果   有用   类型   注意   

原文地址:https://www.cnblogs.com/facelessmen/p/9520679.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!