博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python基础-异常处理
阅读量:4613 次
发布时间:2019-06-09

本文共 5199 字,大约阅读时间需要 17 分钟。

第一种:语法错误

第二种:逻辑错误

语法错误
语法错误在Python是无法避免的,需要修正后方可运行

if 3 > 2 ##少了个冒号,不符合Python的语法    print(1)打印结果:SyntaxError: invalid syntax 无效语法

本文主要讲逻辑错误

什么是异常

异常就是程序运行时发生错误的信号

Python中的异常种类

在python中不同的异常可以用不同的类型(python中统一了类与类型,类型即类)去标识,不同的类对象标识不同的异常,一个异常标识一种错误
AttributeError 试图访问一个对象没有的树形,比如foo.x,但是foo没有属性x
IOError 输入/输出异常;基本上是无法打开文件
ImportError 无法引入模块或包;基本上是路径问题或名称错误
IndentationError 语法错误(的子类) ;代码没有正确对齐
IndexError 下标索引超出序列边界,比如当x只有三个元素,却试图访问x[5]
KeyError 试图访问字典里不存在的键
KeyboardInterrupt Ctrl+C被按下
NameError 使用一个还未被赋予对象的变量
SyntaxError Python代码非法,代码不能编译(个人认为这是语法错误,写错了)
TypeError 传入对象类型与要求的不符合
UnboundLocalError 试图访问一个还未被设置的局部变量,基本上是由于另有一个同名的全局变量,
导致你以为正在访问它
ValueError 传入一个调用者不期望的值,即使值的类型是正确的
ArithmeticError
AssertionError
AttributeError
BaseException
BufferError
BytesWarning
DeprecationWarning
EnvironmentError
EOFError
Exception
FloatingPointError
FutureWarning
GeneratorExit
ImportError
ImportWarning
IndentationError
IndexError
IOError
KeyboardInterrupt
KeyError
LookupError
MemoryError
NameError
NotImplementedError
OSError
OverflowError
PendingDeprecationWarning
ReferenceError
RuntimeError
RuntimeWarning
StandardError
StopIteration
SyntaxError
SyntaxWarning
SystemError
SystemExit
TabError
TypeError
UnboundLocalError
UnicodeDecodeError
UnicodeEncodeError
UnicodeError
UnicodeTranslateError
UnicodeWarning
UserWarning
ValueError
Warning
ZeroDivisionError

异常处理的几种方式

之前一直在使用的if判断

def login():   print('欢迎进入登录页面')def register():   print('欢迎进入注册页面')def transfer():   print('欢迎进入转账页面')def save():   print('欢迎进入存钱页面')dic = {   1: login,   2: register,   3: transfer,   4: save,}while 1:    print('''    1.登录    2.注册    3.转账    4.存钱    ''')    num = input('请输入数字')     if num.isdigit():        if 0< int(num) <= len(dic):            dic[int(num)]()        else:            print('请输入范围内的数字')    else:        print('请输入数字')##利用if语句进行条件判断
问题:
问题一:
使用if的方式我们只为第一段代码加上了异常处理,但这些if,跟你的代码逻辑并无关系,这样你的代码会因为可读性差而不容易被看懂
问题二:
这只是我们代码中的一个小逻辑,如果类似的逻辑多,那么每一次都需要判断这些内容,就会倒置我们的代码特别冗长。
总结
1.if判断式的异常处理只能针对某一段代码,对于不同的代码段的相同类型的错误你需要写重复的if来进行处理。
2.在你的程序中频繁的写与程序本身无关,与异常处理有关的if,会使得你的代码可读性极其的差
3.if是可以解决异常的,只是存在1,2的问题,所以,千万不要妄下定论if不能用来异常处理。

异常处理的正确打开方式

基本结构
try:
被检测的代码
except 异常类型:
try中一旦检测到异常,就会执行此处的逻辑

1.单分支

try:    li = [1, 2, 3]    li[100]except IndexError as e: ##指定错误类型    print(e)打印结果:list index out of range

2.多分支

try:    a = 1    b = 2    li = [1,2,3]    li[100]    print(111)    dic = {}    print(dic['key'])    num = input('>>>')    int(num)    print(222)except IndexError as e:    print(e)except KeyError as e:    print(e)except ValueError as e:    print(e)

3.万能异常,exception(不管什么错误,都能捕捉,但是却不能明确知道是哪里出错了)

try:    a = 1    b = 2    li = [1,2,3]    li[100]    print(111)    dic = {}    print(dic['key'])    num = input('>>>')    int(num)    print(222)except Exception:    print('有问题')打印结果:有问题

4.有些时候我们需要知道具体是出了什么错误,有些时候则不需要,这个时候可以使用多分支+万能的结合方法

def login():   print('欢迎进入登录页面')def register():   print('欢迎进入注册页面')def transfer():   print('欢迎进入转账页面')def save():   print('欢迎进入存钱页面')dic = {   1: login,   2: register,   3: transfer,   4: save,}while 1:    print('''    1.登录    2.注册    3.转账    4.存钱    ''')    try:        num = int(input('请输入序号'))        dic[num]()    except ValueError:        print('请输入数字')    except KeyError:        print('请输入正确数字')    except Exception:        pass

5.try...except...else

num = input('请输入数字')try:    int(num)except ValueError:    print('你输入的不是数字吧')else:    print('你输入的是正确的')#当未输入错误值时,会返回else,输入错误值时会返回except里的内容

6.try..except...else..finally

finally 出不出现异常都执行,异常出现前执行fianlly# 用途:   # 1关闭文件句柄,关闭数据库链接.   # 2 函数return之前能够执行finally代码.   # 3, break之前可以执行finally.
1.finally当遇到错误时,finally也会正常返回结果

try:    dic = {}    dic[100]except Exception:    print('出错')finally:    print('666')打印结果:出错666
2.当遇到的错误,捕捉后报错时,finally会在报错的那之前先执行

try:    dic = {}    dic[100]except ValueError:    print('出错')finally:    print('666')运行结果:666Traceback (most recent call last):  File "C:/***.py", line 288, in 
dic[100]KeyError: 100
3.在函数中,遇到return,finally照样能在它之前执行,在循环中遇到break也是一样

def func():    try:        return 666    finally:        print(66)func()运行结果:66

7.主动触发

try:    raise ValueError('值错误')except Exception as e:    print(e)

8.自定义异常

有可能你以后开发遇到一些大项目,出现的错误是python解释器没有给你定义的错误类型.这个时候可以自己定义class PhoneConnection(BaseException):   passtry:   raise PhoneConnection('类型错误')except PhoneConnection as e:   print(e)try:   raise PhoneConnection('手机连接错误')except Exception as e:   print(e)

9.断言

assert 条件

class A:    name = None    def get(self):        if A.name is not None:            num = 123            for i in range(10):                num += i            print(num)        else:            pass        assert A.name is not None        ##直接抛出一个条件,不满足则报错        num = 123        for i in range(10):            num += i        print(num)obj = A()A.name = 'barry'obj.get()
表示一个强硬的态度,不满足条件直接报错

10.try..except 方法比较if方法的好处

try..except这种异常处理机制就是取代if那种方式,让你的程序在不牺牲可读性的前提下增强健壮性和容错性
异常处理中为每一个异常定制了异常类型(python中统一了类与类型,类型即类),对于同一种异常,一个except就可以捕捉到,可以同时处理多段代码的异常(无需‘写多个if判断式’)减少了代码,增强了可读性 
使用try..except的方式
1:把错误处理和真正的工作分开来
2:代码更易组织,更清晰,复杂的工作任务更容易实现;
3:毫无疑问,更安全了,不至于由于一些小的疏忽而使程序意外崩溃了;

异常处理的用处:

1.一些无法预知的错误,需要异常处理
2.如果此时程序需要通过if条件过滤掉很多不必要的因素,可以异常处理.

转载于:https://www.cnblogs.com/Ailsa-a/p/10433581.html

你可能感兴趣的文章
Git 对象 和checkout 和stash的笔记
查看>>
团队项目总结2-服务器通信模型和顺序图
查看>>
hdu 1085 Holding Bin-Laden Captive!
查看>>
[周记]8.7~8.16
查看>>
递归定义
查看>>
kindeditor 代码高亮设置
查看>>
互联网产品的商业模式
查看>>
图的邻接表存储
查看>>
2018 leetcode
查看>>
各浏览器对 onbeforeunload 事件的支持与触发条件实现有差异
查看>>
PHP中获取当前页面的完整URL
查看>>
所谓输入掩码技术,即只有数字键起作用
查看>>
Display对象,Displayable对象
查看>>
安装oracle11G,10G时都会出现:注册ocx时出现OLE初始化错误或ocx装载错误对话框
查看>>
数据结构(并查集):COGS 260. [NOI2002] 银河英雄传说
查看>>
生产环境下正则的应用实例(一)
查看>>
在CentOS7命令行模式下安装虚拟机
查看>>
Arduino可穿戴开发入门教程Arduino开发环境介绍
查看>>
Windows平台flex+gcc词法分析实验工具包
查看>>
3.Python基础 序列sequence
查看>>