python异常:
python的运行时错误称做异常
(1)语法错误:软件的结构上有错误而致使不能被解释器解释或不能被编译器编译
(2)逻辑错误:因为不完整或不合法的输入所致,也多是逻辑没法生成、计算或者输出结果须要的过程没法执行等html
python异常是一个对象,表示错误或意外状况
(1)在python检测到一个错误时,将触发一个异常
python能够一般异常传导机制传递一个异常对象,发出一个异常状况出现的信号
程序员也能够在代码中手动触发异常
(2)python异常也能够理解为:程序出现了错误而在正常控制流之外采起的行为
第一阶段:解释器触发异常,此时当前程序流将被打断
第二阶段:异常处理,如忽略非致命错误、减轻错误带来的影响等python
检测和处理异常:
(1)异常经过try语句来检测
任何在try语句块里的代码都会被检测,以检查有无异常发生
(2)try语句主要有两种形式:
try-except: 检测和处理异常
能够有多个except
支持使用else子句处理没有探测异常的执行的代码
try-finally: 仅检查异常并作一些必要的清理工做
仅能有一个finally
(3)try语句的复合形式:
try-execpt-else-finallylinux
一、异常基础程序员
在编程过程当中为了增长友好性,在程序出现bug时通常不会将错误信息显示给用户,而是现实一个提示的页面,通俗来讲就是不让用户看见大黄页!!!编程
try: pass except Exception as ex: pass
#python3.x中是这么写的,python2.x是这么写的: except Exception,e:python3.x
需求:将用户输入的两个数字相加 ide
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)
二、异常种类函数
python中的异常种类很是多,每一个异常专门用于处理某一项异常!!!url
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
实例:IndexErrorspa
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('错误')
三、异常其余结构
try: # 主代码块 pass except KeyError as e: # 异常时,执行该块 pass else: # 主代码块执行完,执行该块 pass finally: # 不管异常与否,最终执行该块 pass
四、主动触发异常
try: raise Exception('错误了。。。') except Exception as e: print(e)
五、自定义异常
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)
六、断言
# 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、比较三种访问方式
答:第一种和其余种比,...
第二种和第三种比,...
#!/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()的一个例子:点这里