python-异常处理

一、异常

异常是什么?

       就是影响程序正常执行的事件,异常在程序执行的过程中发生,脚本发生异常时,我们需要捕获它,否则程序就会终止。

异常处理:

       1、捕获异常:try:。。。except 。。。。。

 1 while True:
 2     try:
 3         num1=input('>>:')
 4         num2 = input('>>:')
 5         num1=int(num1) #   出错,不再往下执行try里面的代码块, 直接进入except
 6         num2 = int(num2)
 7         num=num1+num2
 8         print(num)
 9     except Exception as e:
10         print(e)  #捕获错误信息   程序重新执行

       2、复杂的异常处理结构:

             try:

                  代码块1

             except:

                  代码块2

             else:

                  代码块3

             finally:

                  代码块4

            不出异常:1-3-4

               出异常:1-2-4

       3、异常种类

           Exception可以捕获所有的异常

           常用的其他异常

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

         对于特殊处理或提醒的异常需要先定义,最后定义Exception来确保程序正常运行

 1 s1 = 'hello'
 2 try:
 3     int(s1)
 4 except IndexError as e:
 5     print e
 6 except KeyError as e:
 7     print e
 8 except ValueError as e:
 9     print e
10 except Exception as e:
11     print e

          主动触发异常

          raise ..............   一般和自定义异常搭配使用

 1 while True:
 2     try:
 3         num1=input('>>:')
 4         num2 = input('>>:')
 5         num1=int(num1) 
 6         num2 = int(num2)
 7         num=num1+num2
 8         print(num)
 9         raise Exception('eeeeeeeeeerrrrrrrrrrrrrrSSSSSSSS') #主动触发异常
10     except Exception as e:
11         print(e)  #  打印出 eeeeeeeeeerrrrrrrrrrrrrrSSSSSSSS

断言:  assert 条件

1 print(1)
2 assert 1==1
3 print(2)
4 '''输出:1
5          2
6 '''

二、反射

       以字符串的形式去访问对象中指定的属性,反射有四个方法:      

            hasattr(容器,'名称')    以字符串的形式判断某对象中是否含有指定的属性

            getattr(容器,'名称')    以字符串的形式去某个对象中获得指定的属性

            setattr(容器,'名称',值)      以字符串的形式去某个对象中设置指定的属性

            delattr(容器,'名称')     以字符串的形式去某个对象中删除指定的属性

1、允许用户输入 不同的url:
account/login
account/logout
home/index
home/order
2、看到不同的结果
3、输入不存在的url,曝404错误

url列表=[account/login,account/logout,home/index,home/order]
以上url的函数均保存在controller下的account脚本中
'''
inp=input('请输入url')
m,n=inp.split('/') #m=account n=login
去某个模块中找函数,如果函数存在就执行函数,如果不存在函数就报错
getattr() #专门用来去某个地方获取内部的东西 (以字符串的形式获取)
 1 from controller import account   #以上url的函数均保存在controller下的account脚本中
 2 
 3 h=hasattr(account,'login1') #去account模块(脚本)中,是否存在login函数
 4 print(h)    # 存在返回true    不存在返回false
 5 getattr(account,'login')# 去account模块(脚本)中获取login函数
 6 
 7 setattr(account,'login1','ddd')   #去account模块(脚本)中添加login1函数
 8 h=hasattr(account,'login1')   #再次判断是否存在login1属性
 9 print(h)  #返回true
10 
11 delattr(account,'login1')  #去account模块(脚本)中删除login1函数
12 h=hasattr(account,'login1')   #再次判断是否存在login1属性
13 print(h)  #返回false

        

                  

原文地址:https://www.cnblogs.com/songxiaonan/p/6127180.html