Python自动化运维之13、异常处理及反射(__import__,getattr,hasattr,setattr)
一、异常处理
python异常:
python的运行时错误称作异常
(1)语法错误:软件的结构上有错误而导致不能被解释器解释或不能被编译器编译
(2)逻辑错误:由于不完整或不合法的输入所致,也可能是逻辑无法生成、计算或者输出结果需要的过程无法执行等
python异常是一个对象,表示错误或意外情况
(1)在python检测到一个错误时,将触发一个异常
python可以通常异常传导机制传递一个异常对象,发出一个异常情况出现的信号
程序员也可以在代码中手动触发异常
(2)python异常也可以理解为:程序出现了错误而在正常控制流以外采取的行为
第一阶段:解释器触发异常,此时当前程序流将被打断
第二阶段:异常处理,如忽略非致命错误、减轻错误带来的影响等
检测和处理异常:
(1)异常通过try语句来检测
任何在try语句块里的代码都会被检测,以检查有无异常发生
(2)try语句主要有两种形式:
try-except: 检测和处理异常
可以有多个except
支持使用else子句处理没有探测异常的执行的代码
try-finally: 仅检查异常并做一些必要的清理工作
仅能有一个finally
(3)try语句的复合形式:
try-execpt-else-finally
1、异常基础
在编程过程中为了增加友好性,在程序出现bug时一般不会将错误信息显示给用户,而是现实一个提示的页面,通俗来说就是不让用户看见大黄页!!!
- try:
- pass
- except Exception as ex:
- pass
#python3.x中是这么写的,python2.x是这么写的: except Exception,e:
需求:将用户输入的两个数字相加
- while True:
- num1 = raw_input('num1:')
- num2 = raw_input('num2:')
- try:
- num1 = int(num1)
- num2 = int(num2)
- result = num1 + num2
- except Exception as e:
- print('出现异常,信息如下:')
- print(e)
2、异常种类
python中的异常种类非常多,每个异常专门用于处理某一项异常!!!
- AssertionError: 断言语句失败
- AttributeError: 属性引用或赋值失败
- FloatingPointError: 浮点型运算失败
- IOError: I/O操作失败
- ImportError: import语句不能找到要导入的模块,或者不能找到该模块特别请求的名称
- IndentationError: 解析器遇到了一个由于错误的缩进而引发的语法错误
- IndexError: 用来索引序列的证书超出了范围
- KeyError: 用来索引映射的键不再映射中
- keyboardInterrupt: 用户按了中断键(Ctrl+c,Ctrl+Break或Delete键)
- MemoryError: 运算耗尽内存
- NameError: 引用了一个不存在的变量名
- NotImplementedError: 由抽象基类引发的异常,用于指示一个具体的子类必须覆盖一个方法
- OSError: 由模块os中的函数引发的异常,用来指示平台相关的错误
- OverflowError: 整数运算的结果太大导致溢出
- SyntaxError: 语法错误
- SystemError: python本身或某些扩展模块中的内部错误
- TypeError:对某对象执行了不支持的操作
- UnboundLocalError:引用未绑定值的本地变量
- UnicodeError:在Unicode的字符串之间进行转换时发生的错误
- ValueError:应用于某个对象的操作或函数,这个对象具有正确的类型,但确有不适当的值
- WindowsError:模块os中的函数引发的异常,用来指示与WIndows相关的错误
- ZeroDivisionError: 除数为0
- 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
更多异常
实例:IndexError
- dic = ["python", 'linux']
- try:
- dic[10]
- except IndexError as e:
- print(e)
实例:KeyError
- dic = {'k1':'v1'}
- try:
- dic['k20']
- except KeyError as e:
- print(e)
对于上述实例,异常类只能用来处理指定的异常情况,如果非指定异常则无法处理。
- # 未捕获到异常,程序直接报错
- s1 = 'hello'
- try:
- int(s1)
- except IndexError as e:
- print(e)
所以,写程序时需要考虑到try代码块中可能出现的任意异常,可以这样写:
- s1 = 'hello'
- try:
- int(s1)
- except IndexError as e:
- print(e)
- except KeyError as e:
- print(e)
- except ValueError as e:
- print(e)
万能异常 在python的异常中,有一个万能异常:Exception,他可以捕获任意异常,即:
- s1 = 'hello'
- try:
- int(s1)
- except Exception as e:
- print(e)
接下来你可能要问了,既然有这个万能异常,其他异常是不是就可以忽略了!
答:当然不是,对于特殊处理或提醒的异常需要先定义,最后定义Exception来确保程序正常运行
- s1 = 'hello'
- try:
- int(s1)
- except KeyError as e:
- print('键错误')
- except IndexError as e:
- print('索引错误')
- except Exception as e:
- print('错误')
3、异常其他结构
- try:
- # 主代码块
- pass
- except KeyError as e:
- # 异常时,执行该块
- pass
- else:
- # 主代码块执行完,执行该块
- pass
- finally:
- # 无论异常与否,最终执行该块
- pass
4、主动触发异常
- try:
- raise Exception('错误了。。。')
- except Exception as e:
- print(e)
5、自定义异常
- class MyException(Exception):
- def __init__(self, msg):
- self.message = msg
- def __str__(self):
- return self.message
- try:
- raise MyException('我的异常')
- except WupeiqiException as e:
- print(e)
6、断言
- # assert 条件
- assert 1 == 1
- assert 1 == 2
二、反射
python中的反射功能是由以下四个内置函数提供:hasattr、getattr、setattr、delattr、__import__(module_name)、importlib,改五个函数分别用于对对象内部执行:检查是否含有某成员、获取成员、设置成员、删除成员、导入模块以字符串方式导入。
- class Foo(object):
- def __init__(self):
- self.name = 'python'
- def func(self):
- return 'func'
- obj = Foo()
- # #### 检查是否含有成员 ####
- hasattr(obj, 'name')
- hasattr(obj, 'func')
- # #### 获取成员 ####
- getattr(obj, 'name')
- getattr(obj, 'func')
- # #### 设置成员 ####
- setattr(obj, 'age', 18)
- setattr(obj, 'show', lambda num: num + 1)
- # #### 删除成员 ####
- delattr(obj, 'name')
- delattr(obj, 'func')
详细解析:
当我们要访问一个对象的成员时,应该是这样操作:
- class Foo(object):
- def __init__(self):
- self.name = 'python'
- def func(self):
- return 'func'
- obj = Foo()
- # 访问字段
- obj.name
- # 执行方法
- obj.func()
- class Foo(object):
- def __init__(self):
- self.name = 'python'
- # 不允许使用 obj.name
- obj = Foo()
答:有两种方式,如下:
- class Foo(object):
- def __init__(self):
- self.name = 'python'
- def func(self):
- return 'func'
- # 不允许使用 obj.name
- obj = Foo()
- print obj.__dict__['name']
第二种:
- class Foo(object):
- def __init__(self):
- self.name = 'python'
- def func(self):
- return 'func'
- # 不允许使用 obj.name
- obj = Foo()
- print getattr(obj, 'name')
d、比较三种访问方式
- obj.name
- obj.__dict__['name']
- getattr(obj, 'name')
答:第一种和其他种比,...
第二种和第三种比,...
- #!/usr/bin/env python
- #coding:utf-8
- from wsgiref.simple_server import make_server
- class Handler(object):
- def index(self):
- return 'index'
- def news(self):
- return 'news'
- def RunServer(environ, start_response):
- start_response('200 OK', [('Content-Type', 'text/html')])
- url = environ['PATH_INFO']
- temp = url.split('/')[1]
- obj = Handler()
- is_exist = hasattr(obj, temp)
- if is_exist:
- func = getattr(obj, temp)
- ret = func()
- return ret
- else:
- return '404 not found'
- if __name__ == '__main__':
- httpd = make_server('', 8001, RunServer)
- print "Serving HTTP on port 8000..."
- httpd.serve_forever()
结论:反射是通过字符串的形式操作对象相关的成员。一切事物都是对象!!!
类也是对象
- class Foo(object):
- staticField = "old boy"
- def __init__(self):
- self.name = 'wupeiqi'
- def func(self):
- return 'func'
- @staticmethod
- def bar():
- return 'bar'
- print getattr(Foo, 'staticField')
- print getattr(Foo, 'func')
- print getattr(Foo, 'bar')
模块也是对象
home.py
- #!/usr/bin/env python
- # -*- coding:utf-8 -*-
- def dev():
- return 'dev'
index.py
- #!/usr/bin/env python
- # -*- coding:utf-8 -*-
- """
- 程序目录:
- home.py
- index.py
- 当前文件:
- index.py
- """
- import home as obj
- #obj.dev()
- func = getattr(obj, 'dev')
- func()
两个例子:
第一个例子:模块和主程序在同一目录
home.py
- #!/usr/bin/env python
- # -*- coding:utf-8 -*-
- def index():
- print("炫酷的主页面")
index.py
- #!/usr/bin/env python
- # -*- coding:utf-8 -*-
- # 反射:基于字符串的形式去对象(模块)中操作其成员getattr(),setattr(),hasattr(),delattr()
- # 扩展:导入模块
- # import xxx
- # from xxx import ooo
- #
- # obj = __import__("xxx")
- # obj = __import__("xxx." + ooo,fromlist=True)
- def run():
- while True:
- inp = input("请输入要访问的URL:")
- mo,fn = inp.split('/')
- obj = __import__(mo)
- if hasattr(obj,fn):
- func = getattr(obj,fn)
- func()
- else:
- print("网页不存在")
- run()
执行的时候输入URL:home/index 这样就执行了home模块下的index函数
第二个例子:模块和主程序不在同一目录
lib/account.py
- #!/usr/bin/env python
- # -*- coding:utf-8 -*-
- def login():
- print("炫酷的登录页面")
- def logout():
- print("炫酷的退出页面")
index1.py
- #!/usr/bin/env python
- # -*- coding:utf-8 -*-
- # 反射:基于字符串的形式去对象(模块)中操作其成员getattr(),setattr(),hasattr(),delattr()
- # 扩展:导入模块
- # import xxx
- # from xxx import ooo
- #
- # obj = __import__("xxx")
- # obj = __import__("xxx." + ooo,fromlist=True)
- def run():
- while True:
- inp = input("请输入要访问的URL:")
- mo,fn = inp.split('/')
- obj = __import__("lib." + mo,fromlist=True)
- if hasattr(obj,fn):
- func = getattr(obj,fn)
- func()
- else:
- print("网页不存在")
- run()
执行的时候输入URL:account/login 这样就执行了lib/account下的login函数
### 另外一种实现方式
index2.py
- import importlib
- module = "lib.account"
- func_name = "login"
- m = importlib.import_module(module)
- func = getattr(m, func_name)
- func()
利用反射和super()的一个例子:点这里
Python自动化运维之13、异常处理及反射(__import__,getattr,hasattr,setattr)的更多相关文章
- (转)Python自动化运维之13、异常处理及反射(__import__,getattr,hasattr,setattr)
原文:http://www.cnblogs.com/xiaozhiqi/p/5778856.html https://blog.csdn.net/zong596568821xp/article/det ...
- Day1 老男孩python自动化运维课程学习笔记
2017年1月7日老男孩python自动化运维课程正式开课 第一天学习内容: 上午 1.python语言的基本介绍 python语言是一门解释型的语言,与1989年的圣诞节期间,吉多·范罗苏姆为了在阿 ...
- 【目录】Python自动化运维
目录:Python自动化运维笔记 Python自动化运维 - day2 - 数据类型 Python自动化运维 - day3 - 函数part1 Python自动化运维 - day4 - 函数Part2 ...
- Python自动化运维:技术与最佳实践 PDF高清完整版|网盘下载内附地址提取码|
内容简介: <Python自动化运维:技术与最佳实践>一书在中国运维领域将有“划时代”的重要意义:一方面,这是国内第一本从纵.深和实践角度探讨Python在运维领域应用的著作:一方面本书的 ...
- python自动化运维学习第一天--day1
学习python自动化运维第一天自己总结的作业 所使用到知识:json模块,用于数据转化sys.exit 用于中断循环退出程序字符串格式化.format字典.文件打开读写with open(file, ...
- python自动化运维篇
1-1 Python运维-课程简介及基础 1-2 Python运维-自动化运维脚本编写 2-1 Python自动化运维-Ansible教程-Ansible介绍 2-2 Python自动化运维-Ansi ...
- Python自动化运维的职业发展道路(暂定)
Python职业发展之路 Python自动化运维工程 Python基础 Linux Shell Fabric Ansible Playbook Zabbix Saltstack Puppet Dock ...
- Python自动化运维 技术与最佳实践PDF高清完整版免费下载|百度云盘|Python基础教程免费电子书
点击获取提取码:7bl4 一.内容简介 <python自动化运维:技术与最佳实践>一书在中国运维领域将有"划时代"的重要意义:一方面,这是国内第一本从纵.深和实践角度探 ...
- python自动化运维之CMDB篇-大米哥
python自动化运维之CMDB篇 视频地址:复制这段内容后打开百度网盘手机App,操作更方便哦 链接:https://pan.baidu.com/s/1Oj_sglTi2P1CMjfMkYKwCQ ...
随机推荐
- CodeForces 689C Mike and Chocolate Thieves
题目链接:http://acm.hust.edu.cn/vjudge/problem/visitOriginUrl.action?id=412145 题目大意:给定一个数字n,问能不能求得一个最小的整 ...
- NOI题库1159 Maze
1159:Maze 总时间限制: 2000ms 内存限制: 65536kB 描述 Acm, a treasure-explorer, is exploring again. This time he ...
- bzoj1227 [SDOI2009]虔诚的墓主人(组合公式+离散化+线段树)
1227: [SDOI2009]虔诚的墓主人 Time Limit: 5 Sec Memory Limit: 259 MBSubmit: 803 Solved: 372[Submit][Statu ...
- Teacher YYF - POJ 3746(打表........)
1.名词和介词可以被用作主语或宾语 名词->n 介词->pron 2.当使用名词时,必须有冠词在它前面 n+art(冠词) 3.名词可以被一个形容词修饰,动词可以被一个副词修饰 adj+ ...
- DTD与XSD的区别
DTD=类型定义(Documnet Type Definition) XSD=XML结构定义 ( XML Schemas Definition ) DTD 就相当于 XML 中的“词汇”和“语法”,不 ...
- ab测试
PS:网站性能压力测试是性能调优过程中必不可少的一环.只有让服务器处在高压情况下才能真正体现出各种设置所暴露的问题.Apache中有个自带的,名为ab的程序,可以对Apache或其它类型的服务器进行网 ...
- FusionCharts的使用入门
1. Fusioncharts 介绍: Fusioncharts是一个基于Flash的图表组件,可以用来提供数据驱动的动态图标,fusioncharts可用于任何网页脚本语言如, HTML格式,JSP ...
- [2012山东省第三届ACM大学生程序设计竞赛]——n a^o7 !
n a^o7 ! 题目:http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=2413 Time Lim ...
- EditText 密码属性
<EditText android:id="@+id/et_password" android:layout_width="match_parent" a ...
- [Javascript] Using console.count to Count Events
Learn how to user console.count in order to log out how many times a given thing has happened. ; i & ...