异常处理

 

什么是异常?

程序运行时如果出现异常,整个程序就会终止掉了,对于开发者以及用户体验都是不好的。

错误的分类
  • 语法错误

if :
    print(666)
    
while 1:
print(111)
​
def func:
    pass

这类错误写程序是应该避免

  • 逻辑错误

# num = input('>>')
# int(num)
​
dic = {'name': 'barry'}
print(dic['age']
常见的错误类型
AttributeError 试图访问一个对象没有的树形,比如foo.x,但是foo没有属性x
IOError 输入/输出异常;基本上是无法打开文件
ImportError 无法引入模块或包;基本上是路径问题或名称错误
IndentationError 语法错误(的子类) ;代码没有正确对齐
IndexError 下标索引超出序列边界,比如当x只有三个元素,却试图访问x[5]
KeyError 试图访问字典里不存在的键
KeyboardInterrupt Ctrl+C被按下
NameError 使用一个还未被赋予对象的变量
SyntaxError Python代码非法,代码不能编译(个人认为这是语法错误,写错了)
TypeError 传入对象类型与要求的不符合
UnboundLocalError 试图访问一个还未被设置的局部变量,基本上是由于另有一个同名的全局变量,
导致你以为正在访问它
ValueError 传入一个调用者不期望的值,即使值的类型是正确的
等等更多。。。。。。。

异常处理

在异常发生前,我们会捕获到这个异常,并且将程序引流到其他逻辑中,避免程序中断。

为什么进行异常处理

使我们的程序不中断,用户体验感更加,增强了程序的健壮性与容错性 。

异常处理的方法
  • 基本语法

try:
     被检测的代码块
except 异常类型:
     try中一旦检测到异常,就执行这个位置的逻辑
  • if else.只能处理简单的异常,简单的分流。

money = input()
if money.isdecimal():
    int(money)
    if 0<int(money)<10:
        选择
    elsepass
else:
    pass
  • 单分支

try:
    num = input('>>')
    int(num)
    dic = {'name': 'barry'}
    print(dic['age'])
    l1 = [1,2]
    print(l1[100])
except ValueError:
    print('6666')
print(111)
  • 多分支

 try:
     dic = {'name': 'barry'}
     print(dic['age'])
     num = input('>>')
     int(num)
     l1 = [1,2]
     print(l1[100])
 except ValueError:
     print('6666')
 except KeyError:
     pass
 except IndexError:
     print('123213')
 print(111)
  • 万能异常-Exception.

 try:
     l1 = [1, 2]
     print(l1[100])
     dic = {'name': 'barry'}
     print(dic['age'])
     num = input('>>')
     int(num)
 except Exception as e:
     print(e)
  • 多分支+万能异常

s1 = 'hello'
try:
    int(s1)
except IndexError as e:
    print(e)
except KeyError as e:
    print(e)
except ValueError as e:
    print(e)
except Exception as e:
    print(e)
  • 自定义异常

python中定义的错误类型不能满足程序中所遇到的所有的错误。

有的时候你需要自己定义一些错误类型 展示给其他人看。

 class PhoneError(BaseException):
​
     def __init__(self,msg):
         self.msg = msg
​
 try:
     raise PhoneError('手机连接错误')
 except PhoneError as e:
     print(e)
  • 主动抛出异常

try:
    raise TypeError('类型错误')
except Exception as e:
    print(e)
  • 异常处理的其他功能

    try except else

    如果出现异常并处理掉了,else不执行 否则就执行。

 try:
     l1 = [1,2]
     l1[100]
 except IndexError:
     print('输入的有非数字元素')
 else:
     print('转账成功')

try except (else) fianlly

finally: 在异常出现程序马上终止之前,执行的操作。

 try:
     dic = {}
     dic['name']
 # except IndexError:
 #     pass
 finally:
     print(666)
 print(111)

关闭文件句柄

 try:
     f1 = open('test1',encoding='utf-8')
     f1.read()
 finally:
     f1.close()

其他强大的功能

 #return 后finall可以继续执行
 def func():
     try:
         print(111)
         return True
     finally:
         print(222)
 func()
​
#break 后finally也可以继续执行
 while 1:
     try:
         print(111)
         print(222)
         break
     finally:
         print(333)

小节:如果说你就想捕获异常并处理掉,对产生的异常结果不用分流,用万能异常。你想要的通过不同的异常进行分流,多分支。

异常处理的用法

语法的错误我们在写代码时应该就避免,逻辑错误:我们如果可以利用少量的代码避免(if else)也不用用异常处理,异常处理的开销巨大,慎用!

posted @ 2019-12-26 21:26  小辉的  阅读(58)  评论(0)    收藏  举报
/*小图标*/